有了預(yù)編譯橋接頭文件 混合編譯會變得更加快
在多次編譯運(yùn)行了包含復(fù)雜橋接頭文件的OC和Swift的混合項(xiàng)目后我們檢查發(fā)現(xiàn)朴沿,Swift編譯器花了大量時間為項(xiàng)目中的所有Swift文件重新處理相同的橋接頭猜谚。在一些項(xiàng)目中,雖然項(xiàng)目的Swift文件數(shù)量并不多赌渣,但每增加一個Swift文件魏铅,就會顯著增加項(xiàng)目的構(gòu)建時間。
這篇文章將會討論混合編譯時的開銷坚芜,以及它如何在Swift 3.1中得到解決览芳。
問題
每當(dāng)混編項(xiàng)目中一個Swift文件被編譯的時候,Swift編譯器都會解析一次項(xiàng)目的橋接頭文件為了保證OC語言對Swift的可見性(我理解為兩種語言文件可以相互引用方法和訪問變量之類的東西)鸿竖。當(dāng)橋接頭文件很復(fù)雜且Swift編譯器多次運(yùn)行的時候沧竟,就像在debug模式下一樣铸敏,重復(fù)解析橋接頭文件會顯著導(dǎo)致項(xiàng)目構(gòu)建時間變長。
解決辦法
在Swift3.1中悟泵,編譯器獲得了一種新模式來降低編譯的成本杈笔,這個模式就是預(yù)編譯橋接頭。當(dāng)這個模式被啟用的時候糕非,混編項(xiàng)目中編譯器便不會再去重復(fù)解析每個swift的橋接頭文件桩撮,它只會去解析一次,并且將解析的結(jié)果緩存下來(緩存成一個臨時的預(yù)編譯頭文件或者PCH文件)峰弹,這個緩存的結(jié)果可重用于項(xiàng)目中所有的Swift文件店量。相同的預(yù)編譯頭文件技術(shù)也使用于OC和C++代碼的預(yù)編譯頭文件中。
經(jīng)過不斷的測試和完善鞠呈,這種模式可以為Swift項(xiàng)目減少30%的構(gòu)建時間融师。提速的效果取決于項(xiàng)目橋接頭文件的大小,且該模式不會影響到項(xiàng)目整體的最優(yōu)化構(gòu)建蚁吝。在debug模式下旱爆,它能顯著的改善編譯的次數(shù)。
我們來試一試
這種模式是Swift 3.1的一部分窘茁,可在swift.org的夜景快照以及Xcode 8.3測試版中使用怀伦。目前這種模式是實(shí)驗(yàn)性的,必須是手動啟用山林。在之后的版本中房待,如果開發(fā)者的反饋表明改模式的效果良好且的確顯著加速了編譯時間,這種模式將會被默認(rèn)啟用驼抹。同時桑孩,要試用該模式的話,需要安裝支持此模式的編譯器框冀,打開項(xiàng)目的構(gòu)建設(shè)置流椒,并且在“Other Swift Flags”選項(xiàng)中設(shè)置-enable-bridging-pch: