跳到主要内容

编译速度优化

问题

大型 iOS 项目编译慢怎么优化?

答案

编译耗时分析

# Xcode Build Settings 添加
OTHER_SWIFT_FLAGS = -Xfrontend -warn-long-function-bodies=100
# 超过 100ms 的函数体会给出警告

优化策略

策略效果说明
模块化⭐⭐⭐⭐⭐未修改的模块不重新编译
减少类型推断⭐⭐⭐显式类型声明加速类型检查
避免复杂表达式⭐⭐⭐拆分三元/链式表达式
Forward Declaration⭐⭐ObjC 减少 #import
Xcode 并行编译⭐⭐Build Settings: 开启并行构建
预编译框架⭐⭐⭐⭐SPM 二进制目标、XCFramework

编译慢的 Swift 代码

// ❌ 编译器类型推断困难(可能耗时数秒)
let result = items.map { ($0.name, $0.age) }
.filter { $0.1 > 18 }
.sorted { $0.0 < $1.0 }
.reduce("") { $0 + $1.0 + "\n" }

// ✅ 显式类型 + 拆分步骤
let mapped: [(String, Int)] = items.map { ($0.name, $0.age) }
let filtered = mapped.filter { $0.1 > 18 }
let sorted = filtered.sorted { $0.0 < $1.0 }
let result = sorted.reduce("") { $0 + $1.0 + "\n" }

模块化编译优势

┌─── App Target(仅改了 1 个文件)
│ └── 增量编译 ✅
├─── FeatureA.framework(未修改)
│ └── 跳过编译 ✅
├─── FeatureB.framework(未修改)
│ └── 跳过编译 ✅
└─── Core.framework(未修改)
└── 跳过编译 ✅

常见面试问题

Q1: Swift 的 Whole Module Optimization 是什么?

答案:默认 Swift 按文件编译(增量编译友好)。开启 -whole-module-optimization(Release 默认)后,编译器同时看到整个模块的所有源文件,可以做跨文件内联Dead Code Elimination 等全局优化。代价是增量编译失效,全量重编。

相关链接