Доступно сейчас · активация за 5 минут

Перенесите сборку Xcode
на выделенный Mac mini M4

$20.9 / день · выделенный канал 1 Гбит/с
Заказать
Apple M4, выделенный 16 ГБ унифицированной памяти 5 глобальных узлов Поддержка 7×24
iOS Разработка

Ускорение сборки Xcode: локальный MacBook против выделенного облачного M4

У многих indie-разработчиков на столе MacBook Air: на средних и крупных iOS-проектах сборка тянется, вентилятор ревёт, клавиатура греется. В этой статье один и тот же коммерческий проект собирается локально и на выделенном Mac mini M4 в сингапурском узле ZilCloud — с замерами времени, троттлинга CPU, swap и опыта удалённой разработки.

Зачем вообще такое сравнение?

В iOS-сообществе «долгая сборка» — почти общее место. Семантический анализ Swift-фронтенда, построение графа зависимостей модулей, линковка крупного бинарника — каждый шаг жрёт CPU и память. У соло-разработчиков чаще всего MacBook Air: лёгкий, с хорошей автономностью, но 8 ГБ памяти и пассивное охлаждение при полной сборке в Xcode часто не вытягивают.

Аренда Mac в облаке — не новинка, но у многих провайдеров это виртуализация или shared-хостинг: заявленные цифры и реальный опыт сборки расходятся. ZilCloud отдаёт физический Mac mini M4 без соседей — без гипервизора, без overselling, спецификация как у Apple: 10-ядерный CPU (4 performance + 6 efficiency), 16 ГБ унифицированной памяти, 256 ГБ NVMe SSD, выделенный публичный канал 1 Гбит/с.

Конкретный вопрос теста: если не менять локальный ноутбук, а перенести сборку на облачный M4, насколько быстрее? Станет ли ежедневный цикл разработки комфортнее? Окупается ли это по деньгам и по ощущениям? Все цифры ниже — с одной тестовой машины, одного скрипта и одной версии Xcode; воспроизводимо.

Окружение теста

Локально: MacBook Air 15" (M2, 8-ядерный CPU, 8 ГБ унифицированной памяти, 512 ГБ SSD), macOS 15.4, Xcode 16.3, комнатная температура ~26°C, питание от сети.
Облако: Mac mini M4 в сингапурском узле ZilCloud (10-ядерный CPU, 16 ГБ памяти, 256 ГБ SSD, выделенный канал 1 Гбит/с), macOS 15.4, Xcode 16.3, активация ~4 минуты после оплаты, доступ по SSH и браузерному VNC.

Тестовый проект и методология

Объект — реальное коммерческое SwiftUI-приложение (далее RetailApp) такого масштаба:

около 186 Swift-модулей (3 локальных Swift Package и 2 зависимости CocoaPods), более 1 240 исходников, линкованный Release-артефакт ~84 МБ. Включены строгие проверки Swift 6 concurrency, build-фазы SwiftLint и SwiftFormat. Для indie-разработчика это уже «средне-крупный» проект; на 8 ГБ холодная сборка регулярно давит память.

Единая команда сборки

Чтобы исключить разницу GUI, все замеры — через xcodebuild в CLI с /usr/bin/time -l для wall-clock и пиковой памяти:

# Clean build folder first
xcodebuild -project RetailApp.xcodeproj \
  -scheme RetailApp \
  -configuration Release \
  -destination 'generic/platform=iOS' \
  clean build \
  CODE_SIGNING_ALLOWED=NO \
  | tee /tmp/xcodebuild.log

# Wall-clock timing wrapper
/usr/bin/time -l xcodebuild -project RetailApp.xcodeproj \
  -scheme RetailApp \
  -configuration Release \
  -destination 'generic/platform=iOS' \
  build CODE_SIGNING_ALLOWED=NO

Перед тестом на каждой машине — sudo purge для сброса файлового кэша; 3 холодные сборки, берём медиану. Инкрементальная: правка одного View-файла (~120 строк SwiftUI), затем build без clean — тоже 3 прогона, медиана. Spotlight и лишние фоновые приложения отключены; на Air — Low Power Mode выкл, кривая вентилятора через powermetrics.

Удалённый workflow сборки

На облачном узле код через git clone (репозиторий ~380 МБ), зависимости — pod install и swift package resolve на сервере, чтобы окружения совпадали. Локально можно по SSH гонять xcodebuild на облаке или редактировать в VS Code Remote SSH с MacBook, а компиляцию оставить на удалённой машине — ноутбук только пишет код и смотрит логи.

Холодная сборка (Clean Build): цифры

Холодная сборка лучше всего раздвигает разрыв: нет Derived Data, полностью работают Swift-фронтенд, Clang-бэкенд и линкер. Ниже медианы трёх конфигураций (плюс контроль — MacBook Pro M3 Pro 18 ГБ коллеги как ориентир «апгрейда локальной машины»):

Машина Холодная сборка Пик памяти Средняя загрузка CPU Относительно M4 в облаке
MacBook Air M2 · 8 ГБ (локально) 21 мин 34 с 7,6 ГБ + 4,2 ГБ swap 68% (частый троттлинг) медленнее в 2,18×
MacBook Pro M3 Pro · 18 ГБ (контроль) 11 мин 52 с 14,1 ГБ 91% медленнее в 1,20×
ZilCloud Mac mini M4 · 16 ГБ (облако) 9 мин 54 с 13,8 ГБ 94% база
9:54
Холодная сборка M4 в облаке
21:34
Холодная сборка Air M2
2,18×
Разрыв Air vs облако
0 ГБ
Swap на облачном узле

Облачный M4 быстрее MacBook Air M2 примерно в 2,18 раза и даже опережает MacBook Pro M3 Pro 18 ГБ примерно на 20%. Дело не только в поколении чипа: на Air 8 ГБ в пике сборки ушло в 4,2 ГБ swap, powermetrics показал снижение performance-ядер с ~3,4 ГГц до ~2,6 ГГц к 6-й минуте из-за температурного лимита; Mac mini M4 в стойке держит высокие частоты, 10 ядер загружены почти полностью, 16 ГБ памяти — без swap.

По ощущениям: на Air при холодной сборке вентилятор за 2 минуты на максимум, клавиатура горячая, писать код неудобно; сборка в облаке идёт удалённо — ноутбук тихий и прохладный, можно читать документацию или сидеть на видеозвонке.

Инкрементальная сборка и ежедневный цикл

В работе инкрементальная сборка встречается чаще холодной. Правка одного SwiftUI View и повторный build — показатель «насколько цикл разработки течёт гладко»:

Сценарий MacBook Air M2 MacBook Pro M3 Pro ZilCloud M4 (облако)
Build после правки одного View 4 мин 18 с 2 мин 06 с 1 мин 42 с
Добавление модуля Swift Package 7 мин 52 с 4 мин 11 с 3 мин 28 с
Правка Bridging Header (широкая пересборка) 12 мин 44 с 6 мин 33 с 5 мин 19 с
Параллельно unit-тесты (build + test) 9 мин 06 с 5 мин 22 с 4 мин 37 с

Разрыв в инкрементальной сборке меньше, чем в холодной, но M4 в облаке везде впереди. Особенно заметна правка Bridging Header: на Air почти 13 минут — хватит заварить кофе; в облаке 5 мин 19 с — ценно для legacy-проектов с Objective-C мостом.

Практика: Derived Data на облачном SSD

После первого clone зафиксируйте каталог Derived Data на локальном SSD (defaults write com.apple.dt.Xcode IDECustomDerivedDataLocation ...) — инкрементальные сборки ускорятся по мере роста попаданий в кэш. На третьем прогоне инкрементального build у нас выходило 1 мин 18 с.

Нагрев, шум и стабильность

Сборка — не только «на сколько секунд быстрее», но и может ли машина долго держать темп. За 2 часа гоняли холодную сборку каждые 15 минут (8 раундов):

Метрика MacBook Air M2 ZilCloud Mac mini M4
Деградация времени за 8 раундов 21:34 → 26:12 (+21%) 9:54 → 10:08 (+2%)
Пик температуры корпуса 46,8°C (зона клавиатуры) 38,4°C (стойка ЦОД)
Шум вентилятора (субъективно) Постоянный максимум, ~42 дБ Без вентилятора (пассивное охлаждение)
Удобство локальной машины во время сборки Заметные лаги, мультитаскинг страдает Локальный Mac не нагружен
Обрывы SSH / VNC за 8 раундов 0

MacBook Air под длительной нагрузкой показывает явную термальную деградацию: 8-й раунд на 21% медленнее первого, swap вырос с 4,2 до 6,1 ГБ. Mac mini M4 в облаке колеблется в пределах 2% — в духе заявленного ZilCloud SLA 99,9%. Для длинного CI или пакетного Archive стабильность сама по себе — продуктивность.

Симулятор и Archive

Кроме обычного build проверили два частых сценария:

Запуск iOS Simulator + установка: на облачном M4 iPhone 16 Pro Simulator и установка RetailApp Release — от xcrun simctl boot до первого кадра UI ~38 с; на Air M2 ~52 с, плюс симулятор ещё сильнее забивает память. Через браузерный VNC видно экран симулятора — удобно для быстрой приёмки UI; для анимаций лучше сторонний VNC-клиент.

Archive и экспорт IPA: xcodebuild archive + -exportArchive в облаке — 14 мин 22 с (с подписью); на Air M2 — 28 мин 51 с. Сертификат из Keychain экспортируете в .p12, импортируете на узел — как локально. IPA забираете через scp или грузите в TestFlight; с сингапурского узла до серверов Apple задержка ~180 мс, загрузка 84 МБ IPA ~3 минуты.

Стоимость и стратегии использования

Цифры производительности мало что решают, если по деньгам не сходится. ZilCloud считает по дням: стандартный Mac mini M4 — $20,9/день, помесячно $103,9/месяц, без долгосрочного контракта. Типичные схемы по итогам теста:

Стратегия A — узел только для сборки (по дням): арендуете в дни холодных build, релизных пакетов и интеграционных тестов — например 2 дня в неделю, ~$20,9 × 8 ≈ $167/месяц; каждая холодная сборка экономит 11+ минут, Air не занят компиляцией.

Стратегия B — постоянный CI-узел (помесячно): Webhook на Git, каждый push гоняет xcodebuild test в облаке — $103,9/месяц; GitHub Actions macOS runner ~$0,08/мин (20-минутная холодная сборка уже $1,6). Для активной команды окупается за неделю.

Стратегия C — короткий спринт (понедельно): $55,9/неделя перед релизом — миграция, крупный рефакторинг, TestFlight; после релиза узел отключаете, простоя нет.

Если локально уже M3 Pro+ и ≥18 ГБ RAM, выигрыш облака — в разгрузке ноутбука и параллельном CI, а не в абсолютной скорости; для MacBook Air на 8 / 16 ГБ облачный M4 — один из самых выгодных способов ускориться: новый M4 Mac mini от $599, плюс монитор и администрирование.

GitHub Actions и свой CI

Многие команды уже на macos-latest в GitHub Actions. Тот же проект ушёл в приватный репозиторий со стандартным workflow:

jobs:
  build:
    runs-on: macos-14
    steps:
      - uses: actions/checkout@v4
      - name: Install deps
        run: pod install --repo-update
      - name: Build
        run: xcodebuild ... clean build

Холодная сборка в Actions — 34 мин 20 с суммарно (очередь ~8 мин, pod install ~6 мин, сама компиляция ~20 мин). На ZilCloud Derived Data и кэш CocoaPods живут на локальном диске узла — со второго прогона пайплайн укладывается в 12 минут, без очереди.

Actions силён в интеграции с GitHub и нулевом ops; слаб в нестабильности shared runner, долгом cold start, ограниченном кэше и очередях в пик. Не взаимоисключающие варианты: lint и unit-тесты в Actions, Release Archive — на выделенном узле ZilCloud.

Удалённая разработка: опыт и подводные камни

Перенос сборки в облако меняет привычный workflow. Кратко по итогам теста:

SSH + сборка в облаке (рекомендуем): VS Code / Cursor через Remote SSH, LSP на удалённой машине, после сохранения — xcodebuild в терминале. Задержка на ввод почти незаметна (сингапурский узел из Москвы ping ~110 мс, из Европы ~160–200 мс); для крупных бинарников в git — git-lfs.

Браузерный VNC: из консоли ZilCloud — когда нужен GUI Xcode или симулятор. Для статичного UI хватает; анимации — RealVNC или аналог.

Камень 1 — Keychain и сертификаты: первый раз импортируйте .p12 и provisioning profile; в Keychain разрешите codesign доступ к приватному ключу, иначе errSecInternalComponent.

Камень 2 — путь Command Line Tools: на свежем узле иногда нужно sudo xcode-select -s /Applications/Xcode.app, иначе xcodebuild смотрит на CLT и не находит SDK.

Камень 3 — часовой пояс в логах: по умолчанию UTC; для CI-логов команды — sudo systemsetup -settimezone Asia/Singapore или ваш регион.

Хватает ли MacBook — или всё же нужен облачный узел?

После цифр логичный вопрос: может, проще апгрейдить железо или оптимизировать проект?

С бюджетом на MacBook Pro M4 Pro 36 ГБ память и охлаждение действительно перестают быть узким местом — но от ~$2 499, и при полной сборке машина всё равно занята: Figma, Slack и Zoom одновременно некомфортно. Для соло или маленькой команды это тяжёлый разовый чек.

Вспоминают AWS EC2 Mac: официальное железо Apple, но от ~$1,083/час и минимум 24 часа (~$26/день) — дороже $20,9/день у ZilCloud, без гибкой посуточной остановки и без кластера Thunderbolt 5. Плюс квоты и онбординг EC2 Mac тяжелее, чем 1–5 минут автоматической активации ZilCloud после оплаты.

GitHub Actions, Bitrise и прочий shared CI хороши для стандартных пайплайнов, но холодная сборка, постоянный кэш и работа с симулятором на shared runner менее предсказуемы; в пик очередь 10–20 минут — реальная цена в день релиза.

Роль облачного Mac mini M4 проста: не меняя локальный Mac, получить всегда «полный газ» на отдельной машине для сборки. 10 ядер CPU без соседей, 16 ГБ памяти, выделенный канал 1 Гбит/с, пять узлов (Сингапур / Токио / Сеул / Гонконг / восток США), от $20,9/день, без overselling. Арендуете на спринт — или держите постоянно — гибкости, которой нет у покупки нового Mac или долгого облачного контракта.

MacBook Air вполне тянет iOS-разработку, пока проект не вырос. Когда он вырос — сборку на облачный M4, тишину и автономность — локальному ноутбуку часто оказывается самым выгодным разделением труда.

Доступно сейчас · активация за 1–5 минут после оплаты

Перенесите сборку Xcode на выделенный облачный M4

Физический Mac mini M4: 10 ядер CPU и 16 ГБ памяти только для вас. SSH, VNC, оплата по дням без контракта — сборка больше не грузит ваш MacBook.

$20.9 / день · 5 глобальных узлов
Чип Apple M4
CPU 10 ядер, выделенных
Память 16 ГБ унифицированной
Диск 256 ГБ NVMe
Публичный канал 1 Гбит/с, выделенный
SLA 99.9%
Активация 1–5 минут