Xcode9においてビルド高速化するための手法についてまとめました。
設定ファイルの最適化
ビルドの速度に関係する主な項目が下記になります。それぞれの設定の意味と推奨される設定値を解説していきます。
- Build Active Architecture
- Debug Information Format
- WholeModuleOptimization
- XFrontendOptions
- New Build System
Build Active Architecture
Build Settings
>Build Active Architecture
をDebug
時に限りYES
に設定する
実行する対象のArchitectureのみを出力するオプションです。
DebugビルドはデフォルトでYES
になっているはずですが一応確認しておくと良いかと思います。
Debug Information Format
Build Settings
>Debug Information
をDWARF with dSYM
からDWARF
にする
DebugビルドはデフォルトでDWARF
になっていますが、実機ビルドなどでdSYM
が必要になるのであれば下記のように設定することができます。
Whole Module Optimization
このオプションを有効にすることでフルビルドにかかる時間が少なくとも1/2以下になるようです。(とあるプロジェクトで実施したところ 274s
-> 98s
という結果でした。) 下記2つの設定を変更することでwhole module optimization
を有効にしつつ、コードの最適化は実行しないようにします。
Optimization Level
をFast, Whole Module Optimization
に設定するOther Swift Flags
に-Onone
を設定する
whole module optimization
の仕組みについては
Swift.org - Whole-Module Optimization in Swift 3
で説明されています。並列処理は減少することになりますが、重複する処理は減少することにより結果的にビルド速度が向上しているのではないかと思われます。随所で推奨する記事を見かけますが差分コンパイルが劇的に遅くなるので何も考えず入れて良い設定ではないことに注意しましょう。
XFrontend Options
コンパイラの解析部分に対するオプションになります。こちらにいくつかオプションを指定することでコンパイルに時間がかかっているメソッドや式を解析することができます。
-XFrontend -warn-long-function-bodies=limit
Xcode9以前からもあったオプションですが特定のメソッドの解析にlimit
以上の時間がかかっている場合、該当の箇所に警告を出力します。
-XFrontend -warn-long-expression-type-checking=limit
こちらはXcode9から提供されているオプションです。式の解析にlimit
以上の時間がかかっている場合、該当の箇所に警告を出してくれます。前述のオプションではメソッド単位のワーニングしか判別できませんでしたが、このオプションによってより細かく判別することが可能になります。
New Build System
Xcode9から新たに提供されているビルドシステムで、公式では下記のように説明されています。
- New in Xcode 9 – Preview of a new build system written in Swift. Currently, This system is optional but it will become the default in a future version of Xcode - Added a preview of a new build system written in Swift. - Provides higher reliability. - Catches many project configuration problems. - Improves overall build-system performance. Note, build system performance does not include the compilers, linkers, and other tools used by the build system.
- 将来的にはデフォルトで提供されるビルドシステムだがpreviewとしてオプションで使用できる
- 現在より高い信頼性を提供する
- プロジェクトの設定による問題をキャッチする
- 全体的なパフォーマンスを向上させる
- コンパイラやリンカなどのパフォーマンスを向上させるわけではない
とのことで基本的にはメリットしかなさそうです。
下記記事によると28%速度が向上したとのこと。 https://www.linkedin.com/pulse/get-faster-more-stable-xcode-your-swift-projects-dan-zinngrabe/
Framework分割
Frameworkを適切な粒度に分割して差分ビルドしやすい構成にします。Webフロントエンドでもリソース取得の効率化のためにバンドルするファイルを分割することがありますが構成は似たような形になるかと思います。現状XcodeはDynamic Frameworkしかサポートしていないため、起動時間が遅くなってしまうことが懸念されますがStatic Framework化する方法が下記ページにて紹介されています。
Carthage/StaticFrameworks.md at master · Carthage/Carthage · GitHub
また副次的な効果ではありますが依存や設計が整理されるのも大きなメリットかと思います。
まとめ
Xcode開発者の悩みの種であるビルド速度についてまとめました。もしあまり考慮していない場合は参考にして頂ければと思います。ちなみに自分の場合はフルビルドが走った際は、Webフロントエンドの作業に移行するようにしています。