embryo

エンジニアの備忘録

Xcode9のビルドを高速化する

Xcode9においてビルド高速化するための手法についてまとめました。

設定ファイルの最適化

ビルドの速度に関係する主な項目が下記になります。それぞれの設定の意味と推奨される設定値を解説していきます。

  • Build Active Architecture
  • Debug Information Format
  • WholeModuleOptimization
  • XFrontendOptions
  • New Build System

Build Active Architecture

  • Build Settings > Build Active ArchitectureDebug 時に限りYESに設定する

実行する対象のArchitectureのみを出力するオプションです。 DebugビルドはデフォルトでYESになっているはずですが一応確認しておくと良いかと思います。

Debug Information Format

  • Build Settings > Debug InformationDWARF with dSYMからDWARFにする

DebugビルドはデフォルトでDWARFになっていますが、実機ビルドなどでdSYMが必要になるのであれば下記のように設定することができます。

f:id:sue71:20180226121812p:plain

Whole Module Optimization

このオプションを有効にすることでフルビルドにかかる時間が少なくとも1/2以下になるようです。(とあるプロジェクトで実施したところ 274s -> 98sという結果でした。) 下記2つの設定を変更することでwhole module optimizationを有効にしつつ、コードの最適化は実行しないようにします。

  • Optimization LevelFast, 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フロントエンドの作業に移行するようにしています。