👯
Xcode 13.2.1でもビルド時タスク数のmax設定に意味はあったがXcode 14.1では意味がなくなっていた
はじめに
macOSのUser Defaultsでビルド時のタスク数のmax設定であるIDEBuildOperationMaxNumberOfConcurrentCompileTasksの数が設定できる。
しかしnew build system
ではこのmax値の意味がないという記事や、xcodebuildコマンドでのjobsオプションで指定する並列数との関連性が気になったのでその記録を書いておく。結論は意味あるしjobsはその値を上書きする。
-
環境
- Xcode13.2.1
- 設定
-
new build system
は使ってる- xcodebuildのログでわかる
Using new build system
- xcodebuildのログでわかる
-
EnableSwiftBuildSystemIntegration
は使ってない- (話がややこしくなりそうなので今回は使わない)
-
- 設定
- Xcode13.2.1
-
前提
-
Build Timing Summary
で表示される情報って何?- 処理時間
- ビルド時の合計処理時間がわかる
- ビルドの各処理ごとの処理時間もわかる
- タスク数もわかる
- タスク数が具体的にどういう単位なのかはわからない
- おそらくxibはファイル数単位
- .storyboardの数はタスク数とイコールじゃない
- ソースコードの数はタスク数とイコールじゃない
- タスク数が具体的にどういう単位なのかはわからない
- 処理時間
-
結論
鵜呑みにせず自分の環境で測定してほしいけど、私の結果からの結論を書く。
- IDEBuildOperationMaxNumberOfConcurrentCompileTasksに意味はある?
- ある
- maxの数を決めている
- 1にすると処理時間が直列実行であるかのような数字
- maxの数を決めている
- ある
- xcodebuildのオプション
-jobs N
の意味は?- IDEBuildOperationMaxNumberOfConcurrentCompileTasksより優先して使われる
- 例
-
-jobs 100
にしたら100が使われる- 100は逆に遅くなる
-
- ログでわかる
- 例
- IDEBuildOperationMaxNumberOfConcurrentCompileTasksより優先して使われる
- IDEBuildOperationMaxNumberOfConcurrentCompileTasksとかjobsの意味
- おそらく、並列して実行するタスク数のmaxを決めている
- なんで?
- ログから
- storyboardのタスク数 > コードのタスク数のとき、並列実行数を100まで上げると処理時間合計が
storyboardの処理時間 > コードの処理時間
となる- 並列実行数を下げると
コードの処理時間 > storyboardの処理時間
- 並列実行数を下げると
- storyboardのタスク数 > コードのタスク数のとき、並列実行数を100まで上げると処理時間合計が
- 結論
- storyboard系のリソースをビルドしていくのは並列でやって1タスクが終わるのを遅くしてしまうのは全体が遅くなる
- タスク数を処理するmaxだからといってむやみに数字を大きくしてはいけない
-
max=コア数
というのはたしかにそうかも- 個人的にはM1 Maxだと高性能コア8で高効率コア2なので8を設定して運用したい
-
- タスク数を処理するmaxだからといってむやみに数字を大きくしてはいけない
- storyboard系のリソースをビルドしていくのは並列でやって1タスクが終わるのを遅くしてしまうのは全体が遅くなる
- ログから
- なんで?
- おそらく、並列して実行するタスク数のmaxを決めている
実験手順
細かいログは出さないが、手順を書いておく。
現在のIDEBuildOperationMaxNumberOfConcurrentCompileTasksを確認
$ defaults read com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks
IDEBuildOperationMaxNumberOfConcurrentCompileTasksを1にしてjobの数は指定しない
$ defaults write com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks 1
xcodebuildのコマンド
$ xcodebuild clean build -configuration Debug -showBuildTimingSummary -destination "name=iPhone 13 Pro" -sdk iphonesimulator -workspace 内緒 -scheme 内緒
...省略
Build Preparation
Build task concurrency set to 1 via user default IDEBuildOperationMaxNumberOfConcurrentCompileTasks
...省略
xcodebuildのjobsの数を指定する
$ xcodebuild clean build -configuration Debug -showBuildTimingSummary -destination "name=iPhone 13 Pro" -sdk iphonesimulator -workspace 内緒 -scheme 内緒 -jobs 100
次のようにIDEBuildOperationMaxNumberOfConcurrentCompileTasksが100になる
...省略
User defaults from command line:
IDEBuildOperationMaxNumberOfConcurrentCompileTasks = 100
IDEPackageSupportUseBuiltinSCM = YES
...省略
Build Preparation
Build task concurrency set to 100 via user default IDEBuildOperationMaxNumberOfConcurrentCompileTasks
...省略
Discussion