← blog

Self-hosted M4 vs GitHub-hosted M2: a benchmark

July 16, 2026 · 6 min read

Numbers beat adjectives. We ran the same open-source-shaped iOS project — a mixed Swift/Obj-C app with ~40 Pods and a 900-test suite — on a dedicated M4 mini (16GB) and on GitHub's hosted macOS runner. Same Xcode, same workflow, two lines of YAML different.

Results

                     hosted macOS     MacRun M4      delta
clean build            8m 40s          5m 10s        -40%
incremental build      3m 05s          0m 48s        -74%
test suite (900)       6m 20s          4m 05s        -35%
pod install (warm)     1m 30s          0m 06s        -93%

The clean-build gap is the raw chip. The incremental and pod install gaps are the warm disk: on a dedicated box, DerivedData and the Pods cache are still there from the last run. That's the number that compounds across a busy day.

Method

  • Xcode 16.2, identical xcodebuild flags.
  • Hosted: default macos-14 runner, fresh each run.
  • MacRun: M4 · 16GB · 256GB, runner-agent supervising the service.
  • Five runs each; median reported.

Your mileage varies with cache size and parallelism, but the shape holds: the dedicated box wins most on the work you repeat.

Run your own numbers on the calculator or lease a runner.