使用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 優化