优化Xcode编译速度

随着项目的不断迭代,工程变得越来越庞大。大项目不仅面临着架构调整的问题,还要面对每次编译时长不断增加的问题。现在我们的项目全量编译要半个小时。

操作环境
操作系统:MacOS 11
开发工具:Xcode12
CPU:i7 2.2GHz 4核8线程
内存:16GB

业务驱动技术提升

查看编译时长

查看总时长

  1. 关闭Xcode
  2. 执行如下命令
    1
    defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES
  3. 启动Xcode

查看单个编译单元的时长

BuildTimeAnalyzer-for-Xcode

该插件会罗列单个编译单元的时长

首次启动该工程,根据配置指导走完后,需重新运行。

优化Xcode配置

以下配置都是在工程对应TargetBuild Settings中操作

全模块编译(Whole-Module Optimization,WMO)

在编译项目时,将同属于一个Module(可以理解为一个 Target、一个 Package)的所有源代码都串起来,进行整体的一个分析与优化,区别于 Single-File Optimizatin(单文件优化,以下简称SFO),WMO可以更好的统筹全局,去inline函数调用、排除死函数(即写了却从不调用的函数)等

User-Define中增加SWIFT_WHOLE_MODULE_OPTIMIZATION选项卡,值为Yes

Release模式中,建议打开此选项。

调试信息处理

Debug Information Format选项中,

  • Debug模式的值DWARF with dSYM改为DWARF
  • Release模式的值是DWARF with dSYM,因为一般工程都会集成Bugly,而Bugly问题分析是需要.dSYM文件的,如果不生成,线上崩溃是没有办法定位信息的。

DWARF意思是矮小的,不作数的。

架构配置

Build Active Architecture Only选项里的Debug模式的值No改为Yes

Release模式的值必须是No;虽说现在苹果全线都Arm架构了,但是仍然有arm64,armv7,armv7s等区分。

编译优化等级(Optimization Level)

在设置编译优化之后,Xcode断点和调试信息会不正常,所以一般静态库或者其他Target可以这样设置。

系统级提升

增加编译线程数

1
defaults write com.apple.Xcode PBXNumberOfParallelBuildSubtasks 4

虚拟盘

使用虚拟磁盘。编译过程中需要大量的磁盘 IO,这主要发生在Derived Data目录下,因此如果内存足够,可以考虑划出4G左右的内存,建一个虚拟磁盘,这样将会把磁盘IO优化为内存IO,从而提高速度。
由于打包机器每次都会重编译,因此不需要担心重启机器后缓存丢失的问题。

代码优化

  1. 去除警告
  2. 三目运算符
  3. 提前计算常量
  4. 宏定义
  5. 类型推断