ペンギン村 Tech Blog

技術をこよなく愛するエンジニア集団が在住するペンギン村から、世界へ役立つ(かもしれない)技術情報を発信する技術系ブログです。某アラレちゃんが済む村とは一切関係ありません。んちゃ!

Xcode 9 の New Build System を試す

この素晴らしきビルドシステムに祝福を。

どうも tobi462(過去記事)です。

さて、Xcode 9 から新しいビルドシステムが導入されたのは記憶に新しいですが、9.3 の時点でも Preview となっており標準のビルドシステムにはなっていません。

すでに他記事でも紹介や現状のビルドシステムとの比較がされていますが、実際に自分でやってみないと信用しない質のエンジニアなので、今回は自分で試してみた結果です。

追記(2018/05/27):
逆にビルド時間が長くなったり、そもそもエラーでビルドできないケースもあるようです。現時点では Preview 扱いなので、そのうち改善されるかもしれません。

Tl;Dr

  • 以下のパフォーマンス向上結果が得られた
    • Clean Build で 95%
    • 差分ビルドで 90%
  • 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環境を試し続けている(ことを目標としている)以下の個人リポジトリにてパフォーマンス比較を行ってみることにしました。

github.com

環境は以下のとおりです。

・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… を選び f:id:yu_dotnet2004:20180519200043p:plain

ダイアログの Build SystemNew Build System (Preview) を選択します。 f:id:yu_dotnet2004:20180519200055p:plain

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

設定すると以下のような感じで、ビルドにかかった時間が表示されるようになります。 f:id:yu_dotnet2004:20180519200119p:plain

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 の開発版のツールチェーンを入手することが出来ます。(少し前までは自分でビルドするしか無かったのですが;

f:id:yu_dotnet2004:20180519200143p:plain

試しに Swift 4.2 のツールチェーンでも New Build System を試してみたのですが、これはビルドエラーとなりました。

ビルドシステムはコンパイラやリンカと密接に連携するため、このあたりは相性的なものがあるのかもしれません。Swift ツールチェーンを切り替えることが多い方は、こういった問題も起こりうると覚えておくと良いかもしれません。

まとめ

Tl;DR とほぼ同じですが;

  • 以下のパフォーマンス向上結果が得られた
    • Clean Build で 95%
    • 差分ビルドで 90%
  • New Build System では Clean が高速化して一瞬になっていた
  • Swift 4.2 のツールチェーンではビルドエラーになった
  • 自分のPJで試して問題なさそうなら積極的に使っても良さそう?

というわけで検証結果でした。