優化 iOS 項目編譯時間

隨着項目愈來愈大,編譯時長也會愈來愈長。那麼編譯的優化就必不可少了。git

查看編譯時長

在 xcode 的編譯 log 能夠查看時長,也能夠查看總時長,每個 文件的編譯時長。github

swift 類型檢查耗時

對於 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

項目設置優化

使用 New Xcode Build System

dSYM

能夠設置在 debug 不生成 dSYM,只在 release 生成。閉包

模塊化

能夠把 pod 等第三方庫先打包成 .a 文件,而後再放入項目裏面,這樣 pod 的第三方庫就編譯時間就會減小。可是這樣一來 調試就不方便了,因此這是個取捨問題。app

Object-C 的優化

oc 的優化,重點在於減小無效引用,對編譯時長的優化提高很是明顯。 經過 log 看哪些文件編譯時間比較長的文件,進行優化。frontend

快捷鍵⌘ + 8模塊化

優化pch文件

一、檢查 pch 文件,刪除用的很少的引用。

h 文件

.h 文件儘可能少寫引用。引用盡可能寫在 .m文件裏。能夠在編譯 log 中看有哪些文件編譯時間比較長的,大部分均可以經過 優化引用來解決。

刪除不用引用

項目時間長了以後,由於功能變化,有些類可能已經不用了,可是引用還在,這個必定要刪掉。

通過優化,編譯時長減小了2-3 分鐘。

Swift 優化

優化選擇

根據以前說法,把 swift 的文件合併成一個,能夠大大減小編譯時長。可是 xcode10 已經沒用這個選項了。 xcode10 已經給出了優化的選擇,咱們主要選擇正確的選項就能夠,根據本身的需求,通常 debug 選擇 增量編譯,Adhoc 和 Release 能夠選擇模塊編譯

原理能夠參考: medium.com/rocket-fuel…

代碼優化

swift 設置優化完以後,主要就是代碼的優化了。swift 耗時的主要就是類型檢查,那麼代碼優化的重點就是 檢查哪些表達式、函數 類型檢查佔用太長時間。

能夠用工具 Swift BuildTimeAnalyzer tool 來查看每個文件的編譯時長。

在網上查了各類說法,下面是 swift 代碼優化的重點,也確實有用。

  • 閉包和 lazy

不推薦

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
    ]
}
複製代碼
  • ArrayDictionary

集合類型 須要指明類型,而且不要用 + 來合併兩個集合

  • 三元運算符 ?:
// 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 {
    // ...
}
複製代碼

代碼優化能夠參這裏

參考

相關文章
相關標籤/搜索