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

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

0x00 遇到編譯速度問題

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

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

編譯速度直接影響開發(fā)效率. 因?yàn)殚_發(fā)工作需要專注, 編譯的時(shí)候, 程序員們大多都是在等, 這簡(jiǎn)直是在浪費(fèi)生命.

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

0x01 檢查編swift譯速度

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

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

1. 編譯參數(shù)

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

2. 類型推導(dǎo):

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

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

3. 需要計(jì)算的表達(dá)式

如果表達(dá)式中存在常量的表達(dá)式, 編譯器可能會(huì)在編譯時(shí)進(jìn)行計(jì)算, 如果我們幫編譯器算出, 會(huì)提高編譯速度.

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

4. 復(fù)雜的表達(dá)式

復(fù)雜表達(dá)式的處理, 是swift編譯器的弱項(xiàng). 稍微復(fù)雜點(diǎn)的表達(dá)式, 甚至?xí)幾g失敗, 很多人應(yīng)該遇到過. 同時(shí), 復(fù)雜表達(dá)式也會(huì)導(dǎo)致編譯速度變慢.

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

5. 過長(zhǎng)的鏈?zhǔn)讲僮?/h2>
r=a.func1().func2().func3()
let b=a.func1()
let c=b.func2()
r=c.func3()

6. 數(shù)組+操作

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

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

7. 打印函數(shù)

不debug的時(shí)候, 將print注釋掉

8. 代碼中的警告

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

0x03 其他

1. 補(bǔ)充

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

2. 感想

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

3. 參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 找出編譯耗時(shí)過長(zhǎng)的文件 要優(yōu)化項(xiàng)目的編譯速度,首先需要把耗時(shí)過長(zhǎng)的文件找出來,然后進(jìn)行重點(diǎn)優(yōu)化。這里會(huì)用到Xcod...
    慌莫染閱讀 4,698評(píng)論 2 7
  • (原文版本:Commits on Dec 11, 2017 ce6da1f3a47220259c3924df62f...
    Vinc閱讀 1,706評(píng)論 0 0
  • iOS 開發(fā)中 Objective-C 是 Clang / LLVM 來編譯的。swift 是 Swift / L...
    forping閱讀 1,141評(píng)論 0 0
  • 找出編譯耗時(shí)過長(zhǎng)的文件 要優(yōu)化項(xiàng)目的編譯速度,首先需要把耗時(shí)過長(zhǎng)的文件找出來,然后進(jìn)行重點(diǎn)優(yōu)化。這里會(huì)用到Xcod...
    mobilefellow閱讀 2,421評(píng)論 2 8
  • swift 作為一門新語言,受到了廣大開發(fā)者的喜愛,蘋果也極力在推swift,甚至最終會(huì)替換掉OC,筆者現(xiàn)在公司的...
    MrZhaoCn閱讀 4,118評(píng)論 0 8

友情鏈接更多精彩內(nèi)容