使用Swift初期會驚艷于它強大的表達力,發(fā)現(xiàn)原來很啰嗦的邏輯可以用一兩句話寫完時,工具的強大導(dǎo)致自己會情不自禁的寫一些“聰明”的代碼禀梳。但是Swift畢竟是一個嬰兒時期的語言,編譯器對于這些極簡的代碼的處理能力是一個容易被忽略的副作用。
在混編Swift兩年后笔刹,工程的編譯速度到了忍無可忍的程度。通過網(wǎng)上搜尋“如何提高Xcode編譯速度”把能做的優(yōu)化都做了之后冬耿,還是沒有得到根本的提升舌菜。直到發(fā)現(xiàn)了這篇文章Regarding Swift build time optimizations,它采用了一個開源工具來檢測?每一個Swift方法的編譯時間亦镶,從而定位耗時日月。我通過對耗時語法的修改,成功的把一個超過4年多龐大工程的編譯速度縮短了30%缤骨。
下面介紹一下這次優(yōu)化中遇到的有坑的語法:
1. 避免在Array/Dictionary literals里使用復(fù)雜運算山孔,如 ??
(Nil Coalescing Operator), 隨元素個數(shù)耗時成指數(shù)式增長
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
]
解決方案:用傳統(tǒng)的鍵值對賦值
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
2. 浮點數(shù)參與的數(shù)學(xué)函數(shù)后追加算數(shù)運算, 耗時增長幅度匪夷所思
min(1, 2.0)
+ 1 // 10 ms
+ 2 // 35 ms
+ 3 // 352 ms
+ 4 // 6092 ms
解決方案:數(shù)學(xué)函數(shù)獨立運算,用結(jié)果做算數(shù)運算
let a = min(1, 2.0)
a + 1 + 2 + 3 + 4 // 11 ms
3. 避免在有??的情況下使用 + 來拼接字符串
var a: String?
let _ = (a ?? "")
+ "1" // 27 ms
+ "2" // 101 ms
+ "3" // 1043 ms
+ "4" // 編譯超時
解決方案:采用 \()
(String Interpolation)
let _ = "\(a ?? "")1234" // 73 ms
另外介紹一個hack的設(shè)置
在User-Defined里添加SWIFT_WHOLE_MODULE_OPTIMIZATION = YES
可以在debug選擇Onone的前提下享受到優(yōu)化