前言:
首先在提升项目的编译速度前,有必要了解一下哪些文件编译耗时,GitHub上的一个开源工具:https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode,为我们提供了统计函数编译时间的功能,利用该工具能很方便的查出编译耗时的地方。最后根据统计到的编译时间来进行具体优化。
开源工具使用:
1、打开前言中所写链接并下载其Demo,然后打开下载的Demo并在Xcode中选择相应的Deployment Target,然后运行,运行成功会出现一个弹出框如下图:
2、打开我们要测试的项目,按照弹出框的步骤操作即可,待测试项目运行成功后会出现下图:
具体优化方案:
一、代码层面优化
1、由于在申明对象时没有指定其类型导致编译时Xcode进行了大量的类型推断进而造成编译时间过长。因此需要尽量避免类型推断,在申明一个对象时指定其具体类型。
如:var label = UILabel() ——> var label:UILabel = UILabel()
2、nil类型问题,由于swift存在可选值,因此某些对象的值可能为空,这在代码处理时可能会导致编译很慢。
3、根据工具测试 ++= 运算比较耗时,参考下图:
4、根据工具测试复杂的表达式计算会导致运行速度变慢,拆分计算可以加快编译速度,如下图:
二、编译器层面优化编译时间
方式1、WHO:简单地说,Whole-Module Optimization(全模块优化,以下简称 WMO),即在编译项目时,将同属于一个 Module(可以理解为一个 Target、一个 Package)的所有源代码都串起来,进行整体的一个分析与优化,区别于 Single-File Optimization(单文件优化,以下简称 SFO),WMO 可以更好的统筹全局,去 inline 函数调用、排除死函数(即写了却从不调用的函数)等等,使编译速度加快。但是WMO 只是在 Release 模式下成为了默认且推荐的选项,在 Debug 模式下默认依然是 None。
方式2、如果把所有 Model 文件全部合并到一个文件去编译, 那编译时间会从 1min 35s 减少到 17s,那么我们如果把所有代码文件都合并到一起,那就可以极大地优化编译速度了。WHO也会把文件合并起来再进行编译,实际使用时我们发现编译虽然快了,但对于编译时间的减少还是远没有直接把文件合并到一起那么有效。 主要原因是因为 WHO 除了合并文件之外,还会在预编译阶段做这些事情:检测没有被调用的方法和类型, 在预编译期去掉它们,给没有被继承的类, 没有被继承的方法加上 final 标签,给编译器提供更多信息, 以便这些方法被优化为静态调用或者是内联进去,这些优化会对于程序的效率有很大的提升,但编译时间会有所增加。而通过增加一个编译宏就可以做到只合并文件, 而不做优化,具体操作如下:
(1)进入工程文件设置 ---> Build Setting
(2)如下图操作:
(3)如下图操作:设置 key 为 SWIFT_WHOLE_MODULE_OPTIMIZATION,value 设为 YES