← 技術ブログに戻る

Mac mini M4 徹底評価:
大規模 iOS プロジェクトのビルドに足りるか

データセンターで大規模 iOS プロジェクトを Xcode ビルドする Mac mini M4
大規模 iOS 工程のボトルネックは「最新チップ不足」ではなく、メモリ帯域・並列コンパイル戦略・DerivedData の永続化にあることが多い。

結論先行:大多数の「大型 iOS プロジェクト」(複数 Module、CocoaPods/SPM 混在、main を日次更新するチーム)にとって、Mac mini M4 10 コア + 24GB ユニファイドメモリ は 2026 年時点で最もコスパの高いビルドノードです——コールドスタートのフル Archive P50 は約 11–14 分、増分ビルドは 2–4 分まで圧縮可能。純粋な CI Runner・GUI なしなら 16GB でも十分ですが、Simulator の並列は抑えてください。

本当に算力を食う 4 要素:① 複数 target への swift-frontend 並列;② リンカの LTO / bitcode 仕上げ;③ DerivedData と ModuleCache のランダム読み取り;④ メモリ不足時の swap とサーマルスロットリング。

落とし穴:「ビルドが遅い」をすべて M4 の性能不足に帰し、毎回 CI job でディスクを空にする——永続 DerivedData の効果は、M5 への買い替えより大きいことが多い。運用モデルは self-hosted Runner 高速化ガイド を参照。

Swift ファイルが 500 を超え、Pod が 80 を超え、CI が 1 日 30 回以上走り始めると、調達担当はこう聞きます:Mac mini M4 で足りるのか? M4 Pro が必要か? M5 を待つべきか? Nuvcloud のベアメタル M4 クラスターで、匿名化した実顧客プロジェクト 3 件を 2 週間対照しました——同一 xcodebuild 引数、同一 Xcode 16.4 安定版、同一 DerivedData パス戦略。以下は再現可能な方法論 + サンプルデータであり、ラボベンチマークではありません。自社リポジトリで検証してください。

1)まず定義を揃える:「大型 iOS プロジェクト」とは

業界に「大きい」の統一基準はありません。Nuvcloud の顧客サンプルを 4 段階に分け、以降のデータは主にL 段階に対応します:

段階典型的な特徴コールド Archive P50(M4 16GB)
S · 小〜中規模<150 Swift ファイル、SPM 中心、重い C++ Pod なし4–6 min
M · 中規模150–400 ファイル、CocoaPods + Extension 2–3 個7–10 min
L · 大規模400+ ファイル、Module 10+ / 複数 Target、Flutter/RN ハイブリッド11–16 min
XL · 超大規模Monorepo、ホワイトラベル複数 App、フル LTO18–28 min(工程分割または Runner 追加を推奨)

プロジェクトが L または XL に該当し、かつXcode インデックス + Simulator UI テストを同時に走らせるなら、CPU 型番より先にメモリ構成がボトルネックになります——これはチップ世代を替えるより見落とされがちです。

2)M4 チップ:ビルドに効くのは GPU ではなく CPU 並列とメモリ帯域

Mac mini M4(2024 モデル)ベース構成:10 コア CPU(性能コア 4 + 効率コア 6)、10 コア GPU、ユニファイドメモリ 16GB から(24GB / 32GB 選択可)。xcodebuild の観点では:

  • 性能コアが swift-frontend と clang を担当——Xcode はデフォルトで利用可能な性能コアを使い切ります。効率コアは I/O プリフェッチとバックグラウンドインデックスに依然価値があります。
  • ユニファイドメモリ = コンパイラヒープ + リンカ作業セット + ModuleCache——「ビルドのみ・Simulator なし」なら 16GB で足りることが多い。いったん xcodebuild test で iOS 18 Simulator を起動すると、メモリ曲線は急上昇します。
  • SSD のシーケンシャル速度はボトルネックではなく、ランダム I/O が——DerivedData 内の数万小ファイル。Mac mini 標準 NVMe は大型プロジェクトに十分ですが、ディスク使用率 85% 超で P99 ビルド時間は明らかに悪化します。
  • GPU と Neural Engine は純粋なコンパイルにはほぼ無関係。Core ML 変換や Metal シェーダコンパイルで初めて GPU を使います。

M3 比で M4 の Geekbench シングルは約 15% 向上。ただしすでに十分並列化されたフルリンクでは体感 10–20% 程度で、キーノート級の「2 倍」にはなりません。Apple の ビルド効率ガイド も、モジュール分割と明示的依存を優先すべきとしています——循環依存はハードウェアでは救えません。

3)テスト方法:3 台・2 プロジェクト・同一コマンド

ハードウェア対照(いずれも電源接続、macOS 15.5、自動スリープ無効):

  • A: Mac mini M4 10 コア / 24GB / 512GB SSD(Nuvcloud ベアメタル、サーバールーム恒温)
  • B: Mac mini M2 Pro 10 コア / 16GB / 512GB SSD(顧客持込、オフィス環境)
  • C: MacBook Pro M3 Pro 11 コア / 18GB / 1TB(顧客持込、電源接続)

プロジェクトサンプル:

  • Proj-α(L 段階): UIKit + SwiftUI 混在、CocoaPods 86 個、単一 scheme Archive、約 520 Swift ファイル
  • Proj-β(L+ 段階): モジュール化 + Extension 2 個 + Flutter module、約 680 Swift/ObjC ファイル

統一コマンド(Release / 実機 / テストなし):

xcodebuild -workspace App.xcworkspace -scheme App -configuration Release -destination 'generic/platform=iOS' -derivedDataPath ~/Build/DerivedData clean archive(コールドスタートは clean 含む。増分テストでは clean を外し、同一 DerivedData パスを維持)

各項目 5 回実行の P50、初回は除外(ディスクキャッシュのウォームアップ)。温湿度とサーバールームのネットワークはローカルコンパイル区間に影響しませんが、pod install には影響します——本文の数値は依存関係のダウンロードを含みません

4)コールドスタート全量 Archive:M4 が勝つポイント

Proj-α コールドスタート P50(秒 → 分):

表:Proj-α コールドスタート全量 Archive · Xcode 16.4 · Release
マシンcompilelink合計
M4 24GB(A)548 s142 s~11.5 min
M2 Pro 16GB(B)672 s178 s~14.2 min
M3 Pro 18GB(C)598 s155 s~12.6 min

Proj-β(Flutter 含む)ではコールドスタートの差が拡大:M4 P50 ~15.8 min、M2 Pro ~20.4 min。Flutter の ios/Flutter と Xcode ネイティブ target が CPU を奪い合います。24GB メモリで M4 はほぼ swap なし、M2 Pro 16GB は link 段階で memory pressure が発生し、P99 は 24 分に達することもあります。

解釈: M4 は M2 Pro に対し compile 段階で約 18%、link 段階で約 20% 先行——リンクはシングルスレッド敏感で、新チップの恩恵は非線形です。Whole Module Optimization + LTO を有効にすると link 比率はさらに上がり、チップ交換の限界効用は小さくなるため、target 分割の最適化を優先すべきです。

5)増分ビルド:M4 の本領

日常開発の 80% は「数ファイルを変更したビルド」。DerivedData を保持した状態で、Proj-α の Swift ファイル 1 件変更後の増分 Archive P50:

マシン増分 P50備考
M4 24GB2 min 10 s安定
M2 Pro 16GB2 min 45 sModule 境界変更時に全量再ビルドが発生することあり
M3 Pro 18GB2 min 22 s安定

Xcode メジャーバージョン更新や SWIFT_VERSION 変更は ModuleCache を強制無効化します——これが WWDC シーズンの CI 遅延 の主因のひとつです。CI にとってDerivedData を job 間で維持することは M5 への買い替えより効果的。ホステッド Runner と self-hosted の対照では、同一 M4 でも ephemeral ディスク P50 28 min、永続ディスク P50 9 min を確認しています(高速化ガイド 参照)。

6)16GB / 24GB / 32GB:後悔しない選び方

構成向くシーン大型プロジェクトのリスク
16GB純 CLI CI Runner;Simulator なし;単一 jobxcodebuild test と Archive の並列で swap;Xcode GUI インデックスが重い
24GBチーム共有 Runner + たまに VNC 障害対応;1 日 10–30 回ビルドProj-β 級で Simulator 2 台同時はまだ厳しい
32GBMonorepo、並列 UI テスト、Instruments 常駐コスト上昇;純 compile では限界効用逓減

2026 年のメモリ価格高騰を踏まえると、24GB は L 段階プロジェクトのスイートスポット。予算が 16GB に張り付くなら、workflow で UI テストと Archive を別 Runner label に分離し、同一マシンでのメモリ競合を避けてください——手順は beta / 本番 Runner 分離 を参照。

7)並列度チューニング:M4 の 10 コアを本当に使い切る

デフォルトの xcodebuild は利用可能コア数を読み取りますが、大型プロジェクトでは以下の設定が足を引っ張ることが多いです:

  • SWIFT_COMPILATION_MODE = wholemodule は大きな target でメモリ急増——module 単位の分割はメモリ追加より安い。
  • CI Release では不要な DEBUG_INFORMATION_FORMAT = dwarf-with-dsym を無効化(ローカル Debug は維持)。
  • -jobs を明示:サーバールームの M4 では -jobs 8 を常用(システムと sshd 用に 2 コア確保)、OOM を回避。
  • CocoaPods の use_frameworks! :linkage => :static は動的ライブラリのリンク時間を短縮できるが、初回ビルドは長くなる——チームでトレードオフ。

Activity Monitor で swift-frontend が 4–5 プロセスだけフル稼働し他コアが暇なら、多くはtarget 依存の直列化か巨大 Swift ファイルが原因——M4 を責める前に Build Timeline(Xcode 16+)を確認してください。

8)2 つの負荷モデル:開発機 vs 7×24 CI

モデル A · リモート開発ビルドXcode ビルド遅延ガイド 参照):ローカルは軽量ノートでコード、M4 へ SSH して xcodebuild単回の増分レイテンシと VNC の滑らかさを重視するなら 24GB が余裕です。

モデル B · self-hosted CI:GitHub Actions / GitLab Runner を M4 に登録し、1 日数十回実行。永続 DerivedData、ディスク寿命、並列キューが重要。16GB で足りることが多く、ボトルネックはチップではなく job の待ち行列です。

Flutter 三端末キャッシュ戦略は別記事:Flutter iOS CI。Fastlane 署名パイプライン:TestFlight CI

9)M4 Pro・第 2 台 Runner・クラウド拡張が必要なタイミング

以下のシグナルが出たら、コア追加よりマシン追加が得です:

  1. コールドスタート P50 が安定して >18 min かつ短期で module 分割できない——XL 段階の工程整理を検討し、Pro チップだけに頼らない。
  2. 同一 Runner で PR 待ち >15 min——M4 Pro 1 台より M4 16GB を 2 台で水平拡張。
  3. Simulator UI テストを 3 台以上並列——32GB または専用テスト機;ビルド機とテスト機の label 分離。
  4. 調達リードタイム / オフィス電力 / 運用人力が限られる——クラウドベアメタル M4 で日単位検証、ノード TCO は 6 地域横断比較 を参照。

M4 Pro(12 コア CPU 〜)は Proj-α サンプルでコールドスタートが M4 よりわずか ~8% 速いだけで、価格は大幅に上がります——動画トランスコードやローカル LLM まで走らせない限り、iOS ビルドは Runner 台数を優先してください。

10)よくある質問

Mac mini M4 16GB で大型 iOS プロジェクトはビルドできる? できます。専用 CI ノードとして十分。Xcode GUI + Simulator 2 台の同時起動は避けてください。日常のリモート開発は 24GB を推奨。

GitHub ホステッド macOS と比べ、M4 ベアメタルはどれだけ速い? 純粋な xcodebuild 区間は 10–20% 差程度のことも。エンドツーエンドのホステッド P50 は待ち行列とコールドキャッシュで 25–45 min になりがち。self-hosted M4 + 永続 DerivedData なら 8–12 min に圧縮可能。

M5 Mac mini を待つ価値はある? 今のボトルネックが ephemeral CI ディスクや 16GB の swap なら、M5 でも改善は限定的。プロジェクトが毎年 30%+ ファイル増なら秋に再評価。今は M4 + 永続 Runner が現実的。背景:M5 が WWDC 26 に登場しなかった理由

仮想マシン Mac でベアメタルは代替できる? 署名、性能コアスケジューリング、Metal/Simulator は共有 VM 上で不安定。本番パイプラインはベアメタル Mac mini を使ってください。比較:VM vs 実機

同じ M4 で、コーヒー待ちから Slack 待ちへ

48時間日割で実プロジェクトの P50 を計測 → M4 料金 · Runner 登録は self-hosted ガイド

LIMITED料金プラン