Почему xcodebuild и Xcode 4.2 такие медленные? - PullRequest
6 голосов
/ 16 октября 2011

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

Ответы [ 5 ]

21 голосов
/ 16 октября 2011

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

  • Возврат к 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.
  • Разгрузка зависимых целей, которые меняются не часто. Пример: в большинстве случаев вам не нужно ежедневно перестраивать сторонние библиотеки.

CPU

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 и используйте его в качестве выделенного или распределенного компоновщика.

Ошибка файла

(говорит сам за себя)

1 голос
/ 28 декабря 2011

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

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

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

1 голос
/ 21 октября 2011

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

0 голосов
/ 29 октября 2012

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

0 голосов
/ 15 июля 2012

Краткое примечание, касающееся подхода «выбрасывайте больше оборудования» ..

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

Тест:Создайте / запустите точно такой же проект на клонированных macbooks (где единственная разница должна заключаться в их аппаратном обеспечении)

Старый 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 секунд увеличения скорости

** Частично протестировано: существует значительная разница между временем сборки для ИММУЛЯТОРА между двумя машинами

...