Почему смотрим Clean Build, а не инкрементальную сборку
В повседневной работе изменили один Swift-файл — Xcode пересобирает только затронутые модули, часто за секунды. Инкрементальная сборка зависит от кэша; DerivedData с машины A на B бесполезен. Полная пересборка неизбежна в случаях:
- CI очищает DerivedData при каждом Job
- Смена Xcode или macOS, старый кэш недействителен
- Смена dev-машины, нет исторического кэша
- выполнить
xcodebuild clean buildилиxcodebuild archiveRelease-сборку
Поэтому clean build — реальный критерий «выдержит ли машина iOS pipeline». Скорость инкрементальной сборки больше про привычки и частоту правок, а не потолок железа. Все данные — полный clean build, одинаковые стартовые условия на трёх машинах.
Тестовая среда и проект
Сравнение осмысленно при одном проекте, одной версии Xcode и похожей комнатной температуре; три раунда, медиана.
Перед каждым раундом rm -rf ~/Library/Developer/Xcode/DerivedData —
сборка с нуля.
Тестовый проект: среднее SwiftUI-приложение, ~92k строк Swift, 2 Extension Target (WidgetKit + Share Extension), ~5800 Swift-файлов, ~12 локальных Swift Package.
Версия Xcode: Xcode 16.4, macOS 15.5 Sequoia (одинаково на всех трёх машинах).
Раунды: по 3 clean build + 3 Archive на машину, медиана. Clean build: xcodebuild clean build -scheme AppName -destination generic/platform=iOS; Archive: xcodebuild clean archive -scheme AppName -archivePath /tmp/app.xcarchive.
Железо: ① MacBook Air M2 (2022) · 8-ядерный CPU · 16 GB unified memory · 256 GB SSD; ② MacBook Pro 14" M1 Pro (2021) · 10-ядерный CPU · 16 GB unified memory · 512 GB SSD; ③ VPSRox Mac mini M4 (2024) · 10-ядерный CPU (4P+6E) · 16 GB unified memory · 256 GB NVMe · ЦОД (Гонконг).
MacBook Air M2 — 8-ядерная версия (самая распространённая), не 10-ядерный топ. MacBook Pro M1 Pro и VPSRox M4 Mini — по 10 ядер: сравниваем поколения M1 Pro vs M4 и влияние охлаждения.
Результаты полной Clean Build
Таблица — медиана wall-clock трёх clean build, пик памяти и пик CPU по Xcode.
Пики памяти — memory_pressure и Activity Monitor во время сборки.
| Машина | CPU | Медиана Clean Build | Пик памяти | Отклонение раунд 3 vs раунд 1 |
|---|---|---|---|---|
| MacBook Air M2 (8 ядер) | 8-ядерный M2 | 5m 42s | 11,8 GB (редкий лёгкий swap) | +38s (сильный thermal throttling) |
| MacBook Pro 14" M1 Pro (10 ядер) | 10-ядерный M1 Pro | 4m 08s | 10,9 GB (без swap) | +14s (лёгкий thermal throttling) |
| VPSRox Mac mini M4 (10 ядер) | 10-ядерный M4 | 3m 11s | 9,4 GB (без swap) | +2s (почти без отклонения) |
Колонка «раунд 3 vs 1» показательна: у Air третий clean build на 38 s медленнее первого — пассивное охлаждение и снижение частоты. У Pro — 14 s, но эффект есть. VPSRox M4 Mini в стойке ЦОД — разница 2 s, в пределах погрешности.
Для одной сборки MacBook Pro M1 Pro уже неплох. В CI важна не первая попытка, а стабильность на 10-й и 50-й подряд. Разница в охлаждении умножается.
Сравнение времени Archive
Archive ближе к production, чем clean build: помимо компиляции — подпись, bitcode (если включён), dSYM и упаковка символов. На том же проекте Archive обычно в 1,2–1,4 раза дольше clean build.
| Машина | Медиана Archive | Прирост относительно Clean Build | Среднее 5 прогонов (оценка) |
|---|---|---|---|
| MacBook Air M2 (8 ядер) | 7m 18s | +1m 36s | ~8m 40s (охлаждение тормозит) |
| MacBook Pro 14" M1 Pro (10 ядер) | 5m 22s | +1m 14s | ~5m 45s |
| VPSRox Mac mini M4 (10 ядер) | 4m 06s | +55s | ~4m 10s (очень стабильно) |
По Archive видно, что M4 сильнее на этапе dSYM и символов — ~19% быстрее M1 Pro, не только за счёт частоты ядер. Связано с пропускной способностью памяти и Neural Engine.
Для Fastlane каждый fastlane gym ≈ полный Archive + export —
на M4 Mini суммарно ~5 мин 30 с, на Air M2 ~10 мин.
Несколько сборок в день (dev/staging/production) — разница бьёт по ритму релизов.
Thermal throttling и давление на память: скрытые факторы локальной машины
Многие обзоры дают только холодный старт и игнорируют thermal accumulation. Apple Silicon снижает частоту при перегреве до восстановления охлаждения. Безвентиляторный MacBook Air страдает сильнее всех.
Thermal throttling на MacBook Air M2
У Air M2 после второго clean build (~11 мин) дно корпуса заметно горячее;
pmset -g thermlog показывает CPU_Speed_Limit с 100 до ~78 —
третья сборка >30 s медленнее первой. Серия CI на Air системно +15%–30% к холодному старту и непредсказуема.
Границы активного охлаждения MacBook Pro M1 Pro
Активное охлаждение MacBook Pro помогает, но не полностью. При >28°C в помещении или нескольких Simulator иногда лёгкий throttling. Наши +14 s — более тёплый третий раунд; при 22°C отклонение ~8 s.
Тепловая стабильность в ЦОД
Узел VPSRox в стойке 18–22°C, у Mac mini M4 активное охлаждение — стабильность времени сборки выше любого ноутбука. В наших трёх раундах разница 1 vs 3 — 2 s. Для CI с предсказуемым окном это ценно: можно опираться на p99, а не бояться случайного таймаута.
MacBook Air у окна при >27°C летом throttling наступает раньше и сильнее. Зимой та же машина может быть на 20%–30% быстрее. Бенчмарк — в вашей реальной среде, а не в климатической камере обзоров.
Пик памяти и влияние swap на скорость
На 16 GB unified memory давление памяти при крупных iOS-проектах реально.
Xcode на этапах линковки и подписи поднимает много процессов; Swift-компилятор тоже прожорлив.
Пики проверяли vm_stat и memory_pressure.
Air M2 на clean build ~11,8 GB пика; при параллельной компиляции двух Extension — кратковременный swap 200–400 MB, скорость SSD влияет на прогресс. M1 Pro ~10,9 GB, swap не было. VPSRox M4 Mini ~9,4 GB — M4 эффективнее по памяти на той же задаче.
| Машина | Пик памяти | Был ли swap | Пик CPU в пик компиляции | Запись на SSD (Clean Build) |
|---|---|---|---|---|
| MacBook Air M2 | 11.8 GB | Да (~300 MB) | ~780% (~8 ядер на полную) | ~4,2 GB |
| MacBook Pro M1 Pro | 10.9 GB | Нет | ~980% (почти 10 ядер) | ~3,8 GB |
| VPSRox Mac mini M4 | 9.4 GB | Нет | ~960% (почти 10 ядер) | ~3,5 GB |
Для проектов >200k строк или многих Swift Package 16 GB на Air чаще упирается в память. VPSRox предлагает расширение SSD (+1TB $2.6/день, +2TB $5.2/день), но RAM пока только 16 GB — учитывайте при выборе.
Когда локального MacBook всё ещё достаточно
Не каждой команде нужен облачный узел; в следующих случаях MacBook справится:
- Небольшой проект (<30k строк Swift): clean build на любом MacBook с Apple Silicon укладывается в 2 минуты — узкого места по производительности нет.
- Редкий CI (<5 сборок в день): даже при clean build 7–8 минут суммарное время сборок за день остаётся в пределах 40 минут — приемлемо.
- Solo-разработчик, в основном локальная отладка: инкрементальной сборки обычно достаточно; clean build нужен перед релизом — MacBook Pro M1 Pro и новее справляются.
- Пользователи MacBook Pro M3/M4: охлаждение и производительность новейшего MacBook Pro (M4 Max) близки к Mac mini M4; разница скорее в стабильности длительных сборок, чем в разовой скорости.
Облачный узел стоит оценить, если: CI >20 сборок в день, общая среда сборки для команды (без «у меня работает»), MacBook Air и растущий проект, или изоляция нескольких независимых проектов.
Итог: как считать стоимость и выгоду
Стоимость облачного Mac очевидна: Mac mini M4 VPSRox — $21.8/день, ~$109.1/мес. при постоянном использовании — дешевле нового MacBook Pro, но регулярный расход. Что вы экономите?
Команда из 5 iOS-разработчиков, ~30 clean build/Archive в день: на Air M2 ~8 мин в среднем (лёгкий throttling) — 240 мин машинного времени. На VPSRox M4 Mini ~123 мин. Экономия ~117 мин/день — для параллельных веток CI это быстрее review и релизы.
Скрытая цена — переключение внимания при ожидании сборки. До 5 минут многие смотрят прогресс; после 8 минут уходят в другие задачи. По исследованиям flow state возврат к пику ~20 минут. $109/мес. за узел — скорее «стоимость фокуса», чем только сервер.
Когда имеет смысл облако: проект >50k строк + MacBook Air + CI >15 сборок в день — все три условия.
Сначала апгрейд локального Mac: основная работа — локальная отладка (не CI) + средний проект + ограниченный бюджет — MacBook Pro M4 может быть выгоднее аренды.
Взаимодополняющая связка: локальный MacBook — инкрементальная сборка и отладка; CI на выделенном облачном узле — чёткое разделение ролей.
Облачный M4 вместо локального Mac с нестабильным охлаждением
VPSRox — выделенный Mac mini M4 в ЦОД, без thermal throttling, 100% физический сервер, посуточно без контракта. Доставка за 1–5 мин, пять узлов.