Как изменить количество строковых потоков в Xcode?

Я создаю пару файлов на С++ в xcode, которые занимают много памяти для компиляции (+1 ГБ/файл). Поскольку я делаю это на своем двухъядерном ноутбуке, xcode использует 2 потока для построения. Эти два потока в конечном итоге будут создавать файлы, которые занимают много памяти одновременно, поэтому система страдает от голода в памяти, а компиляция превращается в почти остановку.

Достаточным решением для меня было бы заставить Xcode использовать только один поток сборки. Кто-нибудь знает способ изменить, сколько использует потоки сборки Xcode?

Для тех, кто интересуется, файлы С++ содержат значимый парсер boost:: spirit:: qi.

Ответы

Ответ 1

Количество потоков Xcode, используемых для выполнения задач, контролируется опцией PBXNumberOfParallelBuildSubtasks. Вы можете изменить его с помощью следующей команды: - defaults write com.apple.Xcode <key> <value>. Например:

defaults write com.apple.Xcode PBXNumberOfParallelBuildSubtasks 8

Подробнее см. Пользовательские настройки Xcode.

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

Удачи!

Ответ 2

С XCode 5 вы можете использовать -parallelizeTargets и -jobs NUMBER с помощью xcodebuild. Согласно xcodebuild --help:

-parallelizeTargets     build independent targets in parallel
-jobs NUMBER            specify the maximum number of concurrent build operations

Ответ 3

Для Xcode 4 вы должны установить для пользователя IDEBuildOperationMaxNumberOfConcurrentCompileTasks значение по умолчанию, например:

defaults write com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks 4

Обратите внимание на "dt". Это не повлияет на xcodebuild в командной строке. Чтобы сделать это, используйте что-то вроде

xcodebuild -IDEBuildOperationMaxNumberOfConcurrentCompileTasks=4 ...

(см. http://lists.apple.com/archives/xcode-users/2011/Apr/msg00403.html и http://lists.apple.com/archives/xcode-users/2011/Jul//msg00377.html)

Ответ 4

Одна задача сборки никогда не должна выполнять одну и ту же работу дважды, и, конечно же, не одновременно! Извлеките массивный кусок общего кода в статическую библиотеку, чтобы он мог перекомпилироваться только тогда, когда он изменяется. Установите целевую зависимость в приложении в статической библиотеке и ссылку в статическом библиотечном продукте. Изменения в остальной части вашего приложения больше не потребуют восстановления статической библиотеки, что должно значительно ускорить время сборки.

Попробуйте исчерпать все решения на уровне проекта, прежде чем управлять Xcode в целом. Слишком легко нанести Xcode на использование только одного потока и забыть изменить его при переходе к новому проекту. Xcode User Default Reference содержит много параметров, которые не отображаются через интерфейс настроек, в том числе:

  • PBXNumberOfParallelBuildSubtasks (положительное целое число)

    Это позволяет вам ограничить использование Xcode только n потоками сборки для каждого компилируемого проекта.

  • BuildSystemCacheSizeInMegabytes (положительное целое число, по умолчанию 1024)

  • BuildSystemCacheMinimumRemovalAgeInHours (положительное целое, по умолчанию 24)

    Увеличение размера кеша PCH и времени хранения может помочь ускорить ваши сборки.