隨着項目愈來愈大,編譯時長也會愈來愈長。那麼編譯的優化就必不可少了。git
在 xcode 的編譯 log 能夠查看時長,也能夠查看總時長,每個 文件的編譯時長。github
對於 swift 來講,編譯耗時的主要就是類型檢查 在 xcode => build settings => Other Swift Flags
添加下面設置,能夠看到 swift 的表達式和函數的 類型檢查的時長。並給出警告。express
-Xfrontend -warn-long-function-bodies=100 (100 means 100ms here, you should experiment with this value depending on your computer speed and project)
-Xfrontend -warn-long-expression-type-checking=100
複製代碼
後面的 100 單位是毫秒,超過這個值,就會給出警告。swift
在終端執行:xcode
defaults write com.apple.dt.Xcode ShowBuildOperationDuration -bool YES
複製代碼
重啓 xcode,編譯能夠看到總耗時 bash
能夠設置在 debug
不生成 dSYM
,只在 release
生成。閉包
能夠把 pod 等第三方庫先打包成 .a 文件,而後再放入項目裏面,這樣 pod 的第三方庫就編譯時間就會減小。可是這樣一來 調試就不方便了,因此這是個取捨問題。app
oc 的優化,重點在於減小無效引用,對編譯時長的優化提高很是明顯。 經過 log 看哪些文件編譯時間比較長的文件,進行優化。frontend
快捷鍵⌘ + 8
模塊化
一、檢查 pch 文件,刪除用的很少的引用。
.h
文件儘可能少寫引用。引用盡可能寫在 .m
文件裏。能夠在編譯 log 中看有哪些文件編譯時間比較長的,大部分均可以經過 優化引用來解決。
項目時間長了以後,由於功能變化,有些類可能已經不用了,可是引用還在,這個必定要刪掉。
通過優化,編譯時長減小了2-3 分鐘。
根據以前說法,把 swift 的文件合併成一個,能夠大大減小編譯時長。可是 xcode10 已經沒用這個選項了。 xcode10 已經給出了優化的選擇,咱們主要選擇正確的選項就能夠,根據本身的需求,通常 debug 選擇 增量編譯,Adhoc 和 Release 能夠選擇模塊編譯
原理能夠參考: medium.com/rocket-fuel…
swift 設置優化完以後,主要就是代碼的優化了。swift 耗時的主要就是類型檢查,那麼代碼優化的重點就是 檢查哪些表達式、函數 類型檢查佔用太長時間。
能夠用工具 Swift BuildTimeAnalyzer tool 來查看每個文件的編譯時長。
在網上查了各類說法,下面是 swift 代碼優化的重點,也確實有用。
不推薦
private(set) lazy var chartViewColors: [UIColor] = [
self.chartColor,
UIColor(red: 86/255, green: 84/255, blue: 124/255, alpha: 1),
UIColor(red: 80/255, green: 88/255, blue: 92/255, alpha: 1),
UIColor(red: 126/255, green: 191/255, blue: 189/255, alpha: 1),
UIColor(red: 161/255, green: 77/255, blue: 63/255, alpha: 1),
UIColor(red: 235/255, green: 185/255, blue: 120/255, alpha: 1),
UIColor(red: 100/255, green: 126/255, blue: 159/255, alpha: 1),
UIColor(red: 160/255, green: 209/255, blue: 109/255, alpha: 1),
self.backgroundGradientView.upperColor
]
複製代碼
推薦:
// Cumulative build time: 56.3ms
private(set) lazy var chartViewColors: [UIColor] = self.createChartViewColors()
// Build time: 6.2ms
private func createChartViewColors() -> [UIColor] {
return [
chartColor,
UIColor(red: 86/255, green: 84/255, blue: 124/255, alpha: 1),
UIColor(red: 80/255, green: 88/255, blue: 92/255, alpha: 1),
UIColor(red: 126/255, green: 191/255, blue: 189/255, alpha: 1),
UIColor(red: 161/255, green: 77/255, blue: 63/255, alpha: 1),
UIColor(red: 235/255, green: 185/255, blue: 120/255, alpha: 1),
UIColor(red: 100/255, green: 126/255, blue: 159/255, alpha: 1),
UIColor(red: 160/255, green: 209/255, blue: 109/255, alpha: 1),
backgroundGradientView.upperColor
]
}
複製代碼
Array
,Dictionary
集合類型 須要指明類型,而且不要用 +
來合併兩個集合
?:
// Before
return someValue > 3 ? someValue - 2 : someValue + 2
// After
if someValue > 3 {
return someValue - 2
} else {
return someValue + 2
}
複製代碼
??
return CGSize(width: size.width + (rightView?.bounds.width ?? 0) + (leftView?.bounds.width ?? 0) + 22, height: bounds.height)
// After
var padding: CGFloat = 22
if let rightView = rightView {
padding += rightView.bounds.width
}
if let leftView = leftView {
padding += leftView.bounds.width
}
return CGSize(width: size.width + padding, height: bounds.height)
複製代碼
?:
和 ??
均可以經過 條件綁定來解決。
不要在一個表達式中既作判斷,又作計算
if number == 60 * 60 {
// ...
}
// After
let number: Double = 60 * 60
if number == 3600 {
// ...
}
複製代碼
代碼優化能夠參這裏