使用Swift初期会惊艳于它强大的表达力,发现原来很啰嗦的逻辑能够用一两句话写完时,工具的强大致使本身会不由自主的写一些“聪明”的代码。可是Swift毕竟是一个婴儿时期的语言,编译器对于这些极简的代码的处理能力是一个容易被忽略的反作用。git
在混编Swift两年后,工程的编译速度到了忍无可忍的程度。经过网上搜寻“如何提升Xcode编译速度”把能作的优化都作了以后,仍是没有获得根本的提高。直到发现了这篇文章Regarding Swift build time optimizations,它采用了一个开源工具来检测每个Swift方法的编译时间,从而定位耗时。我经过对耗时语法的修改,成功的把一个超过4年多庞大工程的编译速度缩短了30%。github
下面介绍一下此次优化中遇到的有坑的语法:swift
??
(Nil Coalescing Operator), 随元素个数耗时成指数式增加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 ] 复制代码
解决方案:用传统的键值对赋值markdown
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里添加SWIFT_WHOLE_MODULE_OPTIMIZATION = YES
能够在debug选择Onone的前提下享受到优化oop
欢迎关注个人公众号SlowCoding 优化