調(diào)整代碼, 加速swift編譯

作者連接: 興趣使然的程序員:http://www.reibang.com/users/94b6bbf8765a/latest_articles

0x00 遇到編譯速度問題

蘋果公司在大力推廣swift語言, 但是swift語言差強人意.

從swift1.2開始在實際項目中引入swift語言, 已經(jīng)有一年多了, 最近遇到一個問題, 就是項目的編譯速度越來越慢,達到了20分鐘左右. 網(wǎng)上也有很多人說類似的問題.

編譯速度直接影響開發(fā)效率. 因為開發(fā)工作需要專注, 編譯的時候, 程序員們大多都是在等, 這簡直是在浪費生命.

進行了一定的研究和實驗以后, 發(fā)現(xiàn)了一些可能的改進方式. 這些改進方式對于發(fā)現(xiàn)同類問題的人, 可以做些參考.

0x01 檢查編swift譯速度

  1. 設置在編譯配置, 輸出編譯時間信息. Other Swift Flas 增加設置: -Xfrontend -debug-time-function-bodies;
  2. 執(zhí)行build, 將build信息存入文本文檔 debug_buld_info.txt;
  3. 提取出所有方法的編譯時間,將信息按照編譯時間由長到短排序: grep [1-9].[0-9]ms debug_build_info.txt | sort -nr >> build_slow.txt;
  4. 檢查編譯時間過長的方法, 進行修改;
  5. 通過檢查, 發(fā)現(xiàn)項目中編譯時間超過500ms的方法有很多, 這是編譯速度慢的一大元兇. 重點對他們進行了修改調(diào)整.

0x02 發(fā)現(xiàn)的影響swift編譯速度的因素

1. 編譯參數(shù)

是否開啟了swift編譯優(yōu)化選項: whole module optimization, 會在一定程度上影響編譯速度. 可以選擇在Debug上關閉. 但是在Release編譯的時候, 不適合關閉.

2. 類型推導:

類型推導可能是導致編譯速度變慢的原因. 網(wǎng)上有個很離譜的一個例子, 大約十多行的代碼, 編譯時間超過24小時, 代碼內(nèi)容只是做了一個嵌套字典定義初始化. 該bug在今年4月份發(fā)現(xiàn), 目前(10月)依舊存在. 猜測swift在設計理論上存在缺陷, 所以這個問題無解. 下面是類型推導的示例:

let createDate = NSDate(timeIntervalSince1970:interval) //變量(常量)的聲明發(fā)生了類型推導
if (doubleNum/60 < 1) { //表達式在計算中發(fā)生了類型推導
var strings: [String] = [] //初始化值進行了類型推導
let createDate:NSDate = NSDate(timeIntervalSince1970:interval)
if (doubuleNum/60.0 < 1.0) {
var strings: [String] = [String]()

3. 需要計算的表達式

如果表達式中存在常量的表達式, 編譯器可能會在編譯時進行計算, 如果我們幫編譯器算出, 會提高編譯速度.

let t=24*60*60*1000
let t=86400000 //24*60*60*1000

4. 復雜的表達式

復雜表達式的處理, 是swift編譯器的弱項. 稍微復雜點的表達式, 甚至會編譯失敗, 很多人應該遇到過. 同時, 復雜表達式也會導致編譯速度變慢.

txt = (note?.text ?? "") + "\n" + selectedText
txt = note?.text ?? ""
txt += "\n"
txt += selectedText 

5. 過長的鏈式操作

r=a.func1().func2().func3()
let b=a.func1()
let c=b.func2()
r=c.func3()

6. 數(shù)組+操作

數(shù)組的+運算符的使用, 會嚴重降低編譯速度. 雖然寫法優(yōu)雅, 但是目前不合適. 只能用相對丑陋的插入操作進行處理.

let all = redBooks + greenBooks + yellowBooks 
var all:[Book]=[Book]() //避免類型推導
for b in redBokks {
    all.append(s) //用插入替換+
}
for b in greenBokks {
    all.append(s)
}
for b in yellowBokks {
    all.append(s)
}

7. 打印函數(shù)

不debug的時候, 將print注釋掉

8. 代碼中的警告

一定要把代碼中得警告都處理掉

0x03 其他

1. 補充

另外還有一些提高編譯速度的方法, 但是不是針對Swift, oc同樣有效, 所以沒有細說. 比如用framwork/lib 替換需要編譯的cocoapods管理的代碼(這個很明顯), 設置多線程編譯, 用性能更好的電腦, 將Debug Information Format改為DWARF, Build Active Architecture Only改為Yes等等.

2. 感想

以前上學的時候, 學過編譯原理, 很喜歡這門課, 但是 沒想到這次會有所幫助, 在分析編譯速度的時候, 能夠有一些思路, 這門課有莫大的幫助.

3. 參考

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市避归,隨后出現(xiàn)的幾起案子劫灶,更是在濱河造成了極大的恐慌,老刑警劉巖仿吞,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刑枝,死亡現(xiàn)場離奇詭異鬼佣,居然都是意外死亡,警方通過查閱死者的電腦和手機额获,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門够庙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抄邀,你說我怎么就攤上這事耘眨。” “怎么了境肾?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵剔难,是天一觀的道長。 經(jīng)常有香客問我奥喻,道長偶宫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任环鲤,我火速辦了婚禮纯趋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘冷离。我一直安慰自己吵冒,他們只是感情好,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布西剥。 她就那樣靜靜地躺著痹栖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蔫耽。 梳的紋絲不亂的頭發(fā)上结耀,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機與錄音匙铡,去河邊找鬼图甜。 笑死,一個胖子當著我的面吹牛鳖眼,可吹牛的內(nèi)容都是我干的黑毅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼钦讳,長吁一口氣:“原來是場噩夢啊……” “哼矿瘦!你這毒婦竟也來了枕面?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤缚去,失蹤者是張志新(化名)和其女友劉穎潮秘,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體易结,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡枕荞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了搞动。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躏精。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鹦肿,靈堂內(nèi)的尸體忽然破棺而出矗烛,到底是詐尸還是另有隱情,我是刑警寧澤箩溃,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布瞭吃,位于F島的核電站,受9級特大地震影響碾篡,放射性物質(zhì)發(fā)生泄漏虱而。R本人自食惡果不足惜筏餐,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一开泽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧魁瞪,春花似錦穆律、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至旅薄,卻和暖如春辅髓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背少梁。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工洛口, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凯沪。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓第焰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親妨马。 傳聞我的和親對象是個殘疾皇子挺举,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容