1. 使用New Build System
苹果 在 Xcode 9 中推出了New Build System,New Build System完全用 Swift 编写,旨在改进整体性能和依赖项管理,但刚推出时候有些未知Bug,苹果也意识到了这点, 所以Xcode9默认不采用New Build System。从 Xcode 10 开始,Xcode10默认采用New Build System, 可以通过Xcode Files-> Project/Workspace Settings打开和关闭
命令行使用:
xcodebuild -UseNewBuildSystem = YES
2. 增加 Xcode 线程数
Xcode在编译时 默认使用与 CPU 内核相同数量的线程。增加 Xcode 编译使用的线程数数量一定程度上可以提升编译速度,但是维护线程数量同样有性能开销,开辟线程数量过多反而会导致编译速度变慢,所以重点在合适的数量上,一般情况下使用内核数就会达到最佳效果,这也是Xcode默认线程数量。
获取当前内核数:
sysctl -n hw.ncpu
查看Xcode当前设置
defaults read com.apple.dt.xcodebuild
defaults read com.apple.dt.Xcode
设置编译线程数量
defaults write com.apple.dt.xcodebuild PBXNumberOfParallelBuildSubtaskssysctl -n hw.ncpu
defaults write com.apple.dt.xcodebuild IDEBuildOperationMaxNumberOfConcurrentCompileTaskssysctl -n hw.ncpu
defaults write com.apple.dt.Xcode PBXNumberOfParallelBuildSubtaskssysctl -n hw.ncpu
defaults write com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTaskssysctl -n hw.ncpu
其中
IDEBuildOperationMaxNumberOfConcurrentCompileTasks --最大编译任务数
PBXNumberOfParallelBuildSubtasks -- 最大并行子任务数
3. 删除部分无用的Run Script
从编译日志中可以看到部分Run Script耗时还是比较长的,所以我们应当尽可能的移除非必要的Run Script,比如Swift Lint等
4. 修改Build Setting
4.1 设置Build Active Architecture Only
开启时,xcode 只会对当为当前 CPU 架构创建二进制文件,在开发阶段,我们只在真机或模拟器(Active Architecture)编译工程。在 Release 的编译中,应该包含所有支持的 CPU 架构,因为该二进制文件将通过 App Store 下发到用户各种各样的设备上。确保在 Debug 配置下设置为 YES,在 Release 配置下设置为 NO
4.2 Compilation Mode
Compilation Mode (SWIFT_COMPILATION_MODE)
此设置决定了 swift 源文件被重新编译的策略。在 Debug 配置下设置为 Incremental, 只重新编译 “过期” 的 swift 源文件。在 Release 配置下设置为 Whole Module, 编译所有 swift 源文件以应用某些代码优化。
4.3 Optimization Level (SWIFT_OPTIMIZATION_LEVEL)
优化级别设置定义了优化构建的方式。由于优化过程涉及额外的工作,因此代码优化会导致构建时间变慢。Debug 配置想应设置为“No Optimization”,因为我们需要快速的编译时间。在Release 配置下,将其设置为“Optimize for Speed”。
4.4 Debug Information Format (DEBUG_INFORMATION_FORMAT)
DWARF:是一种广泛使用的标准化调试数据格式。DWARF 最初是与可执行和可链接格式 (ELF) 一起设计的,尽管它独立于目标文件格式。
调试符号 (dSYM):默认情况下,应用程序的调试版本将调试符号存储在已编译的二进制文件中,而应用程序的发布版本将调试符号存储在配套的 dSYM 文件中以减小二进制文件的大小。
在编译阶段生成dsym文件是比较耗时的操作,所以在debug阶段,因为Xcode已经包含了调试信息,我们无需生成dsym文件,在release环境中,则尽量需要生成dsym文件,以便后续排查crash信息
4.5 避免工程 Header Search Paths 设置了路径递归引用
Xcode 编译源文件时,会根据 Header Search Paths 自动添加 -I 参数,如果递归引用的路径下子目录越多,-I 参数也越多,编译器预处理头文件效率就越低,所以不能简单的设置路径递归引用。同样 Framework Search Paths 也类似处理。
4.6 Enable Index-While-Building Functionality设置为NO
默认开启,Xcode 编译时会建立代码索引,影响编译速度;关闭后,在编译时就不会进行索引,而是在空闲时间建立代码索引(自动补全Code、查找定义)
5. 代码层面
5.1 删除xib
xib文件的编译是很耗时的,
以我们的项目为例,在一次全量编译中,编译较慢的文件中频频出现各种xib,这些xib都是之前遗留的,目前大部分都已废弃不用,在删除部分xib文件后,重新测试十次, 大约节约了数十秒的时间