Xcode - Swiftのメソッド毎のコンパイル時間を計測してビルド時間を短縮する - Qiita がすごく便利そうなので試してみたのですが、結果のテキストが長すぎたのでコンパイル時間の長い順に表示するスクリプトを書きました。
ついでに cocoapods 管理下のファイルは結果に含めないようにしてみました。
スクリプトはこちら
使い方
元記事と同様に以下を実行
- Other Swift Flagsに
-Xfrontend -debug-time-function-bodies
を追加 -
xctool -workspace './xyz.xcworkspace' -scheme 'SchemeName' -jobs 1 clean build | tee build_in_detail.txt
1
生成されたビルド結果のテキストファイルで
-
cat build_in_detail.txt | perl -pe 's/\x1b.*?[mGKH]//g' | ruby swift_build_log_parser.rb
2
とすることで
=== File ===
8294ms SomeView
6729ms MainViewController
6513ms MainViewController
5469ms SomeView
1067ms Fridge
1051ms Fridge
922ms AppDelegate
914ms API
869ms API
609ms OneModel
...
...
=== Method ===
5932.1ms SomeView.swift:98:10 func currentPosition(model: OneModel) -> CGPoint
4896.7ms SomeView.swift:98:10 func currentPosition(model: OneModel) -> CGPoint
3924.1ms MainViewController.swift:280:10 @objc func syncWithRemote(state: Int)
3921.6ms MainViewController.swift:286:79 (closure)
3911.8ms MainViewController.swift:326:56 (closure)
3713.8ms MainViewController.swift:280:10 @objc func syncWithRemote(state: Int)
3712.0ms MainViewController.swift:286:79 (closure)
3705.3ms MainViewController.swift:326:56 (closure)
1560.1ms MainViewController.swift:207:10 @objc func bindDynamically(isInit: Bool)
1491.9ms MainViewController.swift:207:10 @objc func bindDynamically(isInit: Bool)
...
...
=== Build time ===
414618 ms
こんな感じで結果を整理することができます。
感想
関数を大きくしすぎないことは、人間にとっての Readability のみならず、型推論をするコンパイラにとっての Readabilty も向上させるのだなと思いました。