Xcode — профилирование и оптимизация времени компиляции C

#c #xcode #clang #llvm #compile-time

#c #xcode #лязг #llvm #время компиляции

Вопрос:

Как я могу профилировать и оптимизировать время компиляции C с помощью Xcode?

В настоящее время я работаю над игровым проектом на C на основе Cocos2d-x с более чем 250 исходными файлами. Время компиляции (без Cocos2d-x) в настоящее время составляет около 3,5 минут, и я хотел бы узнать, где компилятор тратит больше всего времени и что я могу сделать для его оптимизации.

Я уже делал самые очевидные вещи, такие как всегда делать прямые объявления и применять парадигму «Включить то, что вы используете».

Компилятор является последней версией Clang / LLVM Xcode 8.

Комментарии:

1. Используете ли вы предварительно скомпилированные заголовки? Это дало мне коэффициент ускорения 4 в одном проекте, который я унаследовал без них.

Ответ №1:

Попробуйте создать каталог /tmp/xcode_build_timings и перестроить свой проект. (Не забудьте удалить его позже).

Комментарии:

1. Это звучит интересно …. не могли бы вы быть немного более конкретным? Что он делает? Где именно должна быть папка и т.д.?

2. Я указал точный путь к папке. Итак, я не понимаю, что вы подразумеваете под «где именно должна быть папка»? Затем попробуйте создать свой проект после создания этой папки и проверьте содержимое. Это должно обеспечить время для сборки.

3. Хорошо, имеет смысл.

Ответ №2:

Вы всегда можете попробовать ccache. Хорошо работает в Xcode для меня, если я переопределю CC в настройках проекта. https://ccache.samba.org/

Так, например, установите ccache через brew install ccache . Затем создайте сценарий, который вы храните в системе управления версиями вашего проекта, который выглядит примерно так:

 #!/bin/sh
if type -p /usr/local/bin/ccache >/dev/null 2>amp;1; then
  export CCACHE_CPP2=true
  exec /usr/local/bin/ccache "${DEVELOPER_DIR}/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" "$@"
else
  exec "${DEVELOPER_DIR}/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" "$@"
fi
  

назовите это, например, «ccache-clang». Сохранение этого скрипта в системе управления версиями вашего проекта означает, что вы можете проверить его на другой машине, на которой не установлен ccache, и тогда он просто будет использовать компилятор Clang по умолчанию.

Затем в Xcode в разделе Настройки сборки для вашего проекта добавьте «Определяемый пользователем» параметр «CC» и добавьте его в путь к вашему скрипту. « ${PROJECT_DIR}/ccache-clang » например.

Эта статья — отличный ресурс для начала работы. https://pspdfkit.com/blog/2015/ccache-for-fun-and-profit /

Комментарии:

1. Но разве Xcode уже не делает этого? Где вы переопределили CC и до какого значения? Помогает ли это для профилирования или оптимизации? Пожалуйста, дайте немного больше информации о том, что именно вы делаете и чего достигаете 😉

2. Xcode избегает повторного добавления файлов, когда это возможно, но ccache фактически выполняет компиляцию из кэша на диске, поэтому даже чистая перестройка будет намного быстрее. Я добавил более подробные инструкции

3. Я настроил его сейчас, и, похоже, он работает довольно хорошо, но это не приносит действительно большого улучшения (пока). У меня есть несколько попаданий в кеш здесь и там, но большую часть времени он компилирует новые. Я также попытался поиграть с настройками из статьи. У вас есть какие-то дополнительные советы для меня?

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

5. Ах да … это имеет смысл. Может ли это быть связано с ccache base_dir? Вы установили для этого какое-то значение / в производную папку или в исходную папку?