Я предпочитаю писать довольно большие шаблонные библиотеки С++ только для заголовков, и мои пользователи обычно жалуются на время компиляции. Подумав об этом, мне пришло в голову, что я понятия не имею, куда идет время. Есть ли простой способ профилировать процесс компиляции С++ с помощью общих компиляторов, таких как 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
) второй и третьей цели, чтобы узнать, сколько времени потрачено на оптимизатор.
Ответ 4
Я еще не пробовал, но templight выглядит ОЧЕНЬ многообещающим: https://github.com/mikael-s-persson/templight
Ответ 5
Вы могли бы получить некоторую тягу с некоторым вариантом на strace -e trace=process -f -r -ttt -T
, по крайней мере для компиляторов, таких как g++, которые разбиты на многие процессы.