Профилирование процесса компиляции С++

Я предпочитаю писать довольно большие шаблонные библиотеки С++ только для заголовков, и мои пользователи обычно жалуются на время компиляции. Подумав об этом, мне пришло в голову, что я понятия не имею, куда идет время. Есть ли простой способ профилировать процесс компиляции С++ с помощью общих компиляторов, таких как g++, icc и xlC? Например, можно ли получить представление о том, сколько времени потрачено на каждую из фаз компиляции С++?

Ответ 1

Для GCC есть параметры отладки, чтобы найти how much time is spent within each of the phases of C++ compilation?

-QЗаставляет компилятор распечатывать каждое имя функции по мере ее компиляции и печатать некоторую статистику о каждом проходе, когда он заканчивается.

-ftime-отчетЗаставляет компилятор печатать некоторую статистику о времени, затрачиваемом каждым проходом, когда он заканчивается.

Проходы описаны в GCCINT 9: Проходы и файлы компилятора.

Вы можете отправить вывод компиляции g++ одного исходного файла с -v -ftime-report здесь, чтобы обсудить его. Может быть некоторая помощь в списке рассылки GCC .


Для компиляторов , кроме GCC (или GCC более древних, чем 3.3.6) см. другие параметры в этом потоке.

Ответ 2

Там инструмент из проекта Boost, который может быть полезен практически для любой системы компилятора и сборки.

Инструмент требует инструментария исходного кода с макросами TEMPLATE_PROFILE_ENTER() и TEMPLATE_PROFILE_EXIT(). Затем эти макросы генерируют специфическую диагностику (предупреждения) во время компиляции, которые синхронизируются и собираются вместе с вызовами-экземплярами (которые, следовательно, позволяют создавать и визуализировать callgraphs) с помощью script. Неплохо, ИМО.

Я еще не использовал его.

Ответ 3

Вы можете выделить их в некоторой степени (я предполагаю make)

  • добавьте правило сборки, которое обрабатывает только файлы предварительной обработки (с помощью переключателя -E) и цель .PHONY, которая зависит от выходных файлов препроцессора так же, как и обычная бинарная цель, зависит от файлов .o. Измерьте, сколько времени требуется для создания этой цели.
  • добавить цель 'PHONY, которая зависит от всех файлов .o, но не связывает их. Измерьте, сколько времени требуется для создания этой цели (из чистой).
  • измерьте, сколько времени потребуется, чтобы выполнить чистую сборку обычного двоичного файла

Теперь у вас есть представление о том, сколько времени требуется для предварительной обработки, компиляции и ссылки. Вы также можете сравнить оптимизированные и не оптимизированные версии (-O0) второй и третьей цели, чтобы узнать, сколько времени потрачено на оптимизатор.

Ответ 5

Вы могли бы получить некоторую тягу с некоторым вариантом на strace -e trace=process -f -r -ttt -T, по крайней мере для компиляторов, таких как g++, которые разбиты на многие процессы.