Почему 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 между двумя машинами