Почему xcodebuild и Xcode 4.2 такие медленные?

Я использую Xcode 4.2 в относительно большом проекте (несколько десятков тысяч строк кода), и он ужасно медленный. Редактирование в порядке, но всякий раз, когда я пытаюсь скомпилировать проект (в Xcode или с помощью xcodebuild в командной строке), моя машина (четырехъядерный i7 MacBook Pro, 4 ГБ ОЗУ) останавливается. Я заметил, что непосредственно после запуска xcodebuild он порождает более 8 процессов clang без запуска "настоящих" процессов компиляции. Никакой вывод xcodebuild пока не виден на стауте. Я попытался уменьшить количество параллельных процессов сборки, но все же многие процессы лягушек запускаются в начале. Проект использует 6 или 7 прямых зависимых внешних проектов и может содержать 120 исходных файлов. Под Xcode 3.2 проект раньше компилировался очень быстро. Что происходит? И как я могу сделать Xcode снова быстро?

5 ответов

Решение

У большинства из нас есть три основных варианта:

  • Вернитесь к Xcode 3 для ежедневной разработки.
  • Добавьте больше оборудования в это.
  • Измените структуры ваших проектов и примените крупномасштабные приемы разработки (хотя 20-30 KSLOC невелики).

Самое простое решение - вернуться к Xc3. Да, Xc4 требует намного больше, чем Xc3; память, процессор, дисковое пространство и ввод / вывод. Вам нужно будет определить, где ваши самые большие проблемы, чтобы уменьшить сумму, которая влияет на вас.

Недавно я купил новый MBP с двумя физическими ядрами и двойной физической памятью, обновленный до Lion и обновленный Xc4 одновременно. Время компиляции действительно улучшилось, но большая часть остального на самом деле медленнее и требует гораздо больше ресурсов. Это совсем не то, что можно ожидать от IDE, которая также запрещает несколько открытых проектов, а также использует унифицированное представление рабочей области.

Переход на Lion + Xc4 более чем удвоил мои требования к оборудованию во всех следующих категориях:

объем памяти

4 ГБ сейчас слишком мало для большинства нетривиальных проектов, использующих Xc4 и Lion. Вы все еще можете уменьшить это. У меня есть 8 ГБ и 10 ГБ на моих основных 2 машинах, Xc4 потребляет все это довольно легко (но мои проекты более сложны, чем ваши, если вы не пишете reeaeaaaally длинные строки). В любом случае, вы можете уменьшить эту проблему:

  • Покупая больше памяти.
  • Отключите индексирование, если вы создаете огромные проекты в XCode. Это может вдвое сократить потребление памяти Xcode.
  • Запуск XCode в 32-битной. Это не вариант для всех, потому что он будет превышать 4 ГБ в более крупных проектах.
  • Уменьшите количество процессов сборки (снова).
  • Частый перезапуск XCode (он не очень хорошо очищает себя).
  • Используйте clang в качестве компилятора. Экземпляры Clang обычно используют меньше памяти, чем Apple GCC 4.2.
  • Разгрузка зависимых целей, которые меняются не часто. Пример. В большинстве случаев вам не нужно ежедневно перестраивать сторонние библиотеки.

ЦПУ

Xcode 4 использует новый (более точный) анализатор завершения.

  • Сократите ваши графы включений и зависимостей. Это довольно легко сделать с помощью Obj-C, поскольку каждый экземпляр Obj-C является указателем. Пример: удалите свободно зависимые фреймворки из ваших заголовков.
  • Разделите ваши зависимости и модули правильно. Разрабатывайте библиотеки, но постарайтесь сделать их довольно маленькими и учитывать зависимости, которые они будут добавлять. Пример: я возглавляю проект, в котором разработчик добавил небольшую функцию (менее 1% приложения), но из-за необходимого количества зависимостей (например, Three20, а затем еще нескольких) двоичный размер конечного исполняемого файла удвоился (и время сборки увеличилось, и у парсера было намного больше работы). Большая часть этого не была нужна для функции - они просто не могли быть удалены, потому что они были символами objc.
  • Уменьшите количество переводов, если это возможно.
  • Оптимизируйте, как вы используете префикс заголовки. Вы можете поделиться ими, и вы можете создавать их без уважительной причины. Это приносит пользу компилятору больше, чем IDE.
  • Минимизируйте использование памяти. Работа GC (включая все выделения NSObject) потребляет более 1/3 использования ЦП в более крупных проектах, но она все равно тратит много времени на сбор данных, когда его куча огромна.
  • Используйте внешние текстовые редакторы и клиенты VC. Довольно очевидно, потому что Xc4 довольно часто отображает SBBOD в больших проектах.
  • Минимизируйте языковую сложность. В порядке сложности: C, ObjC, C++, ObjC++. Чем сложнее переводы, тем больше времени потребуется для анализа и компиляции ваших источников, особенно когда ваши зависимости высоки. Если вы можете легко установить языковые барьеры в ваших зависимостях, сделайте это.
  • Вы можете отключить индексирование кода с помощьюdefaults (также уменьшает требования к памяти).

Жесткий диск

Это может быть баланс скорости / размера.

  • Купите более быстрый (например, SSD).
  • Очистите и минимизируйте зависимости заголовка.
  • Используйте RAM-диск, такой как Make RAM Disk.
  • Купи больше памяти. С количеством, которое потребляет Xc4, в больших проектах он часто выгружается на диск.
  • Оптимизируйте свои сборки для правильного использования файлов pch. Это не всегда очевидное направление: я не использовал их в течение нескольких лет в крупных проектах.
  • Очистите временные файлы, оставленные Xcode и Instruments, они могут быть огромными. В некоторых случаях вы можете сохранить их в пользовательских местах. Если они потребляют десятки ГБ, а ваш каталог сборки совпадает с вашим каталогом загрузки, то вы заставите свой диск работать намного меньше, регулярно чистя их.

Строит

  • В Xc4, xcodebuild, параллельный Xcode, теперь удваивает работу (отдельные каталоги сборки по умолчанию). В Xc3 по умолчанию строилась та же цель. Проверьте ваши настройки - Xcode создаст массу избыточного здания, если вы позволите это (например, одна цель на рабочее пространство / конфигурацию, а не модель плоской сборки Xc3).

  • Или просто заполните ящик четырехъядерным MacMinis и используйте его в качестве выделенного или распределенного компоновщика.

Ошибки в файлах

(само за себя)

Вы можете включить Distributed Building в настройках XCode и найти дружелюбного человека, который поможет вам создать ваше приложение, сформировав кластер машин компиляции вместе с вами.

Самое смешное, что даже когда он выключен, ваш компилятор по-прежнему использует другой алгоритм / механизм для создания вашего приложения с невероятной скоростью по сравнению с проблемами, которые были до этого;)

Таким образом, это означает, что они в Apple забыли об одиноких программистах, которые не работают в командах, и поэтому сценарий одинокой компиляции чисто протестирован в версиях 4.0 - 4.2

Еще одно возможное решение, которое в некоторых случаях могло бы помочь ускорить Xcode 4: в моем случае основной проблемой, по-видимому, было то, что четыре файла из моей сборки / папки были случайно зарегистрированы в моем git-репозитории. Во время компиляции Xcode замечает, что папка сборки изменилась, и запускает git. Так как в моем случае папка сборки содержит тысячи файлов, производительность снизилась. Полное удаление сборки / папки из git (в любом случае не должно быть проверено) уменьшило время компиляции и загрузку системы. Производительность по-прежнему ниже, чем у Xcode 3, но намного лучше, чем раньше.

Другой виновник медлительности - плагины. Плагин Subversions абсолютно убивал мою производительность Xcode. Я следовал инструкциям в этом посте, чтобы отключить его. Уф!

Краткое примечание о подходе "добавь больше оборудования".

РЕЗЮМЕ: Я испытал МАЛЕНЬКОЕ увеличение скорости от значительного обновления оборудования

Тест: Постройте / запустите точно такой же проект на клонированных MacBook (где единственное отличие должно быть в их оборудовании)

Старый Macbook Air (1,86 ГГц Core 2 Duo ТОЛЬКО 2 ГБ ОЗУ)
против
Совершенно новый Macbook Pro (2,3 ГГц Core i7 8 ГБ ОЗУ)

СТРОИТЕЛЬСТВО НА IPHONE 3GS
Macbook Air 1:00 - 1:15
Macbook Pro ~ 1: 00

=> От 0 до 0:15 увеличения скорости

СТРОИТЕЛЬСТВО НА IPHONE 4S
Macbook Pro ~ 0: 35
Macbook Air ~ 0: 50

=> ~ 15 секунд увеличения скорости

** Частично протестировано: существует значительная разница во времени сборки для SIMULATOR между двумя машинами

Другие вопросы по тегам