CarthageのビルドフェイズでOutput Files指定による速度調査

CarthageのビルドフェイズでOutput Files指定による速度調査

Table of Contents

この記事はXcodeのビルドフェイズ時にCarthageのフレームワークコピー用スクリプトのOutput Filesの有無によるビルドパフォーマンスについて調査した記事です。

なおCarthageのインストールや基礎など詳細は「Carthageの使い方を体系的に理解する 」にまとめてあります。

調査のきっかけ

Carthage Quick StartCarghage Adding frameworks to an applicationには、Output FilesOutput File Listsを設定しろと書かれています。

しかし、carthage copy-frameworksのコードでは使われていません。

最初はただの更新漏れかと思ったが、調べたらPull Requestを見つけました。

どうやらWWDCの発表によると、Output Filesが設定されていると、Input Filesの変更がなければスクリプトの実行をスキップするらしいです。

つまりOutput Filesは未設定でも動作上問題はないですが、設定はすることでビルド時間の短縮に繋がるようです。

では「どれぐらい違うのか?」を調べようと思いました。

小さな差分でも、開発では何十回もビルドを走らせます。
トータルタイムでいくと効果は侮れません。

調査方法

  • プロジェクトは新規プロジェクトの初期状態+Carthage
  • Output Filesの「あり」「なし」それぞれのビルド時間を10回ずつ測定
  • ビルドを走らせる前に適当なソースファイルを1つ弄ってから実行する
  • ビルド時間はXcodeのPreferences(ShowBuildOperationDuration)を使う

フレームワークのコピー処理の有無ということで、Cartfile はそれっぽい数7個用意。

github "AFNetworking/AFNetworking"
github "suzuki-0000/SKPhotoBrowser"
github "SVProgressHUD/SVProgressHUD"
github "SwiftyJSON/SwiftyJSON"
github "SDWebImage/SDWebImage"
github "payjp/payjp-ios"
github "adjust/ios_sdk"

この場合はInput Filesはこうなります。

$(SRCROOT)/Carthage/Build/iOS/AFNetworking/AFNetworking.framework
$(SRCROOT)/Carthage/Build/iOS/suzuki-0000/SKPhotoBrowser.framework
$(SRCROOT)/Carthage/Build/iOS/SVProgressHUD/SVProgressHUD.framework
$(SRCROOT)/Carthage/Build/iOS/SwiftyJSON/SwiftyJSON.framework
$(SRCROOT)/Carthage/Build/iOS/SDWebImage/SDWebImage.framework
$(SRCROOT)/Carthage/Build/iOS/payjp/payjp-ios.framework
$(SRCROOT)/Carthage/Build/iOS/adjust/ios_sdk.framework

そして、Output Files はこうなります。

$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/AFNetworking/AFNetworking.framework
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/suzuki-0000/SKPhotoBrowser.framework
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/SVProgressHUD/SVProgressHUD.framework
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/SwiftyJSON/SwiftyJSON.framework
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/SDWebImage/SDWebImage.framework
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/payjp/payjp-ios.framework
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/adjust/ios_sdk.framework

測定結果

次の表は調査方法に基づいた調査結果です。

# Output Filesなし Output Filesあり
1 2.300 1.569
2 2.521 1.427
3 2.229 1.455
4 1.867 1.493
5 2.516 1.343
6 2.364 1.710
7 2.158 1.568
8 2.360 1.467
9 2.123 1.575
10 2.243 1.479
Avg 2.2681 1.5086

平均値の差分は0.7595秒つまり34%短縮しました。

感想

想定以上の効果がありました。
調査中も違いを体感で分かるほどです。
ワンテンポ違いました。

しかし、仮に仕事で15分おきに1回ビルドを走らせてるとした場合、
9時間 x 4回 * 0.7595秒 = 27.342秒の違いが出ます。
大したことないですね…
でも短時間に何度もビルドを走らせる状況ではチリツモ効果は出てると予想します。

なお、このパフォーマンスは、Cartfile管理下のライブラリ数とライブラリ規模に依存します。

結論

  • 一定のパフォーマンス効果はある
  • おとなしく設定したほうがいい
このエントリーをはてなブックマークに追加