👯

Xcode 13.2.1でもビルド時タスク数のmax設定に意味はあったがXcode 14.1では意味がなくなっていた

2022/02/04に公開

はじめに

macOSのUser Defaultsでビルド時のタスク数のmax設定であるIDEBuildOperationMaxNumberOfConcurrentCompileTasksの数が設定できる。

しかしnew build systemではこのmax値の意味がないという記事や、xcodebuildコマンドでのjobsオプションで指定する並列数との関連性が気になったのでその記録を書いておく。結論は意味あるしjobsはその値を上書きする。

  • 環境

    • Xcode13.2.1
      • 設定
        • new build systemは使ってる
          • xcodebuildのログでわかる
            • Using new build system
        • EnableSwiftBuildSystemIntegrationは使ってない
          • (話がややこしくなりそうなので今回は使わない)
  • 前提

    • Build Timing Summaryで表示される情報って何?
      • 処理時間
        • ビルド時の合計処理時間がわかる
        • ビルドの各処理ごとの処理時間もわかる
      • タスク数もわかる
        • タスク数が具体的にどういう単位なのかはわからない
          • おそらくxibはファイル数単位
          • .storyboardの数はタスク数とイコールじゃない
          • ソースコードの数はタスク数とイコールじゃない

結論

鵜呑みにせず自分の環境で測定してほしいけど、私の結果からの結論を書く。

  • IDEBuildOperationMaxNumberOfConcurrentCompileTasksに意味はある?
    • ある
      • maxの数を決めている
        • 1にすると処理時間が直列実行であるかのような数字
  • xcodebuildのオプション-jobs Nの意味は?
    • IDEBuildOperationMaxNumberOfConcurrentCompileTasksより優先して使われる
        • -jobs 100にしたら100が使われる
          • 100は逆に遅くなる
      • ログでわかる
  • IDEBuildOperationMaxNumberOfConcurrentCompileTasksとかjobsの意味
    • おそらく、並列して実行するタスク数のmaxを決めている
      • なんで?
        • ログから
          • storyboardのタスク数 > コードのタスク数のとき、並列実行数を100まで上げると処理時間合計が storyboardの処理時間 > コードの処理時間 となる
            • 並列実行数を下げると コードの処理時間 > storyboardの処理時間
        • 結論
          • storyboard系のリソースをビルドしていくのは並列でやって1タスクが終わるのを遅くしてしまうのは全体が遅くなる
            • タスク数を処理するmaxだからといってむやみに数字を大きくしてはいけない
              • max=コア数というのはたしかにそうかも
                • 個人的にはM1 Maxだと高性能コア8で高効率コア2なので8を設定して運用したい

実験手順

細かいログは出さないが、手順を書いておく。

現在の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