この素晴らしきビルドシステムに祝福を。
どうも tobi462(過去記事)です。
さて、Xcode 9 から新しいビルドシステムが導入されたのは記憶に新しいですが、9.3
の時点でも Preview
となっており標準のビルドシステムにはなっていません。
すでに他記事でも紹介や現状のビルドシステムとの比較がされていますが、実際に自分でやってみないと信用しない質のエンジニアなので、今回は自分で試してみた結果です。
追記(2018/05/27):
逆にビルド時間が長くなったり、そもそもエラーでビルドできないケースもあるようです。現時点では Preview
扱いなので、そのうち改善されるかもしれません。
Tl;Dr
- 以下のパフォーマンス向上結果が得られた
- Clean Build で
95%
- 差分ビルドで
90%
- Clean Build で
- Swift 4.2 のツールチェーンではビルドエラーになった
- 自分のPJで試して問題なさそうなら積極的に使っても良さそう?
New Build System ?
What’s New in Xcode を見ると以下のように書かれています。
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.
- 将来的には標準のビルドシステムになる
- Swift で書かれた
- 高い信頼性
- プロジェクト設定の多くの問題を取得
- ビルドシステム全体のパフォーマンス向上
Swift で書かれたということは、以前は他の言語だったということでしょうが、Swift にすることでパフォーマンス向上が計れた部分もあるのでしょうか。
ちなみに Notes
にかかれていますが、コンパイラやリンカなどの他ツールを利用している形になっているので、それらのパフォーマンス向上はないようです。
つまり、プロジェクト構造からビルドすべきファイルを抽出し、妥当なスケジューリングと並列性でコンパイラやリンカを実行するという部分がビルドシステムであり、そこのパフォーマンスや安定性が向上したという感じでしょうか。(あまりこの分野には詳しくないのですが)
検証環境
今回は、モダンなiOS環境を試し続けている(ことを目標としている)以下の個人リポジトリにてパフォーマンス比較を行ってみることにしました。
環境は以下のとおりです。
・Xcode 9.3 ・MacBook Pro (13-inch, 2017) ・Processor 2.5 GHz Intel Core i7 ・Memory 16 GB 2133 MHz LPDDR3 ・macOS High Sierra 10.13.4
プロジェクトに適用する
FIle > Workspace Settings… を選び
ダイアログの Build System
で New Build System (Preview)
を選択します。
Shared Workspace Settings:
だけで十分かなと思ったのですが、念のため Per-User Workspace Settings:
の方も変更しました。
ちなみに Shared Workspace Settings:
の方を変更すると以下のファイルが作成されるようです。
xxx.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>BuildSystemType</key> <string>Latest</string> </dict> </plist>
実行速度を比較する
現状の Xcode では標準でビルド時間が出力されないので、Terminal から以下のコマンドを実行して表示されるようにします。
$ defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES
設定すると以下のような感じで、ビルドにかかった時間が表示されるようになります。
Clean Build
まずはクリーンビルドの比較からです。5回ずつ試してみました。
既存の Standard Build System
では、Clean(Cmd + Shift + K
)のあとでファイルのIndex化が行われているようだったので、それが完全に終わってからビルドを実行するようにしました。
結果は以下のとおりです。
[Standard Build System] 23.425 22.945 21.240 21.006 21.196 [New Build System] 21.797 20.825 20.602 20.402 20.392
平均値で比較すると 94.7%
程度になり、少しパフォーマンスが上がっているようです。個人的に Clean Build はさほど差がでないと予想していたので、これは少し驚きました。
ちなみに New Build System
ではClean
が恐ろしく速かった、というより一瞬になっていました。
俺でなきゃ見逃しちゃうね。
差分ビルド
さて期待している差分ビルドの方です。
こちらは少し雑ですが、1ファイルだけ変更を加えてビルドを再実行する形で計測してみました。
結果は以下のとおりです。
[Standard Build System] 1.492 1.528 1.462 1.472 1.473 [New Build System] 1.329 1.345 1.308 1.312 1.436
これだけ短い時間だと妥当に計測できているかは少し微妙ですが、平均値で比較すると 90.6%
となり、まぁ少なくとも遅くはなっていないようです。
Swift 4.2 の Toolchain ではビルドエラー
Xcode 9.3 には Swift 4.1 までしか入ってないですが、今は Swift の 公式ページ から Swift 4.2 の開発版のツールチェーンを入手することが出来ます。(少し前までは自分でビルドするしか無かったのですが;
試しに Swift 4.2 のツールチェーンでも New Build System
を試してみたのですが、これはビルドエラーとなりました。
ビルドシステムはコンパイラやリンカと密接に連携するため、このあたりは相性的なものがあるのかもしれません。Swift ツールチェーンを切り替えることが多い方は、こういった問題も起こりうると覚えておくと良いかもしれません。
まとめ
Tl;DR とほぼ同じですが;
- 以下のパフォーマンス向上結果が得られた
- Clean Build で
95%
- 差分ビルドで
90%
- Clean Build で
New Build System
では Clean が高速化して一瞬になっていた- Swift 4.2 のツールチェーンではビルドエラーになった
- 自分のPJで試して問題なさそうなら積極的に使っても良さそう?
というわけで検証結果でした。