使用 Swift 初期会惊艳于它强大的表达力,发现原来很啰嗦的逻辑可以用一两句话写完时,工具的强大导致自己会情不自禁的写一些 "聪明" 的代码。但是 Swift 毕竟是一个婴儿时期的语言,编译器对于这些极简的代码的处理能力是一个容易被忽略的副作用。
在混编 Swift 两年后,工程的编译速度到了忍无可忍的程度。通过网上搜寻 "如何提高 Xcode 编译速度" 把能做的优化都做了之后,还是没有得到根本的提升。直到发现了这篇文章 Regarding Swift build time optimizations ,它采用了一个 开源工具 来检测每一个 Swift 方法的编译时间,从而定位耗时。我通过对耗时语法的修改,成功的把一个超过 4 年多庞大工程的编译速度缩短了 30%。
下面介绍一下这次优化中遇到的有坑的语法:
- var a: String ?
- var b: String ?
- var c: String ?
- var d: String ?
- var e: String ?
- var f: String ?
- var g: String ?
- let _ = ["a": a ? ?"", // 1 ms
- "b": b ? ?"", // 3 ms
- "c": c ? ?"", // 11 ms
- "d": d ? ?"", // 48 ms
- "e": e ? ?"", // 274 ms
- "f": f ? ?"", // 1339 ms
- "g": g ? ?"", // 6550 ms
- ]
解决方案:用传统的键值对赋值
- var dict = [String: String]() dict["a"] = a ? ?"" // 30 ms
- dict["b"] = b ? ?"" // 27 ms
- dict["c"] = c ? ?"" // 25 ms
- dict["d"] = d ? ?"" // 27 ms
- dict["e"] = e ? ?"" // 26 ms
- dict["f"] = f ? ?"" // 26 ms
- dict["g"] = g ? ?"" // 28 ms
- min(1, 2.0) + 1 // 10 ms
- + 2 // 35 ms
- + 3 // 352 ms
- + 4 // 6092 ms
解决方案:数学函数独立运算,用结果做算数运算
- let a = min(1, 2.0) a + 1 + 2 + 3 + 4 // 11 ms
- var a: String ?
- let _ = (a ? ?"") + "1" // 27 ms
- + "2" // 101 ms
- + "3" // 1043 ms
- + "4" // 编译超时
解决方案:采用 \() (String Interpolation)
- let _ = "\(a ?? "")1234" // 73 ms
在 User-Defined 里添加
可以在 debug 选择 Onone 的前提下 享受到优化
- SWIFT_WHOLE_MODULE_OPTIMIZATION = YES
来源: https://juejin.im/post/5a42f1156fb9a0452725dbc2