Профилирование процесса компиляции C++
Я склонен писать довольно большие шаблонные заголовки-только библиотеки C++, и мои пользователи обычно жалуются на время компиляции. Подумав об этом, мне пришло в голову, что Я понятия не имею, куда идет время. Есть ли простой способ профилировать процесс компиляции C++ с помощью общих компиляторов, таких как g++, icc и xlC? Например, можно получить представление о том, сколько времени тратится в пределах каждый из этапов C++ компиляция?
5 ответов:
на GCC здесь опции отладки найти
how much time is spent within each of the phases of C++ compilation?- Q Заставляет компилятор распечатывать каждое имя функции по мере ее компиляции и печатать некоторую статистику о каждом проходе, когда он заканчивается.
- ftime-report Заставляет компилятор печатать некоторую статистику о времени, затраченном на каждый проход, когда он заканчивается.
проходы описаны в GCCINT 9: проходит и файлы компилятора.
вы можете опубликовать вывод компиляции g++ из одного исходного файла с помощью
-v -ftime-reportздесь обсудить. Там может быть некоторая помощь на GCC рассылки.
для компиляторов кроме GCC (или GCC более древний чем 3.3.6) см. другие параметры в этой теме.
здесь инструмент из проекта Boost, который может быть полезен практически для любого компилятора и системы сборки.
инструмент требует инструментирование исходного кода С
TEMPLATE_PROFILE_ENTER()иTEMPLATE_PROFILE_EXIT()вызовы макроса. Эти макросы затем генерируют определенные диагностики( предупреждения) во время компиляции, которые синхронизируются и собираются вместе с экземплярами callstacks (которые, следовательно, позволяют строить и визуализация callgraphs) по a скрипт. Неплохо, ИМО.Я еще не использовал его.
Я еще не пробовал, но templight выглядит очень многообещающе:https://github.com/mikael-s-persson/templight
вы можете отделить их в некоторой степени (я предполагаю
make)
- добавьте правило сборки, которое только предварительно обрабатывает файлы (используя
-Eпереключатель), и.PHONYцель, которая зависит от выходных файлов препроцессора так же, как обычная двоичная цель зависит от.oфайлы. Измерьте, сколько времени требуется для создания этой цели- добавить
'PHONYцель, которая зависит от всех.oфайлы, но не связать их. Измерьте, сколько времени требуется, чтобы построить это цель (от чистого)- измерьте, сколько времени требуется, чтобы сделать чистую сборку обычного двоичного файла
теперь у вас есть некоторое представление о том, сколько времени требуется для предварительной обработки, компиляции и ссылки. Вы также можете сравнить оптимизированный и неоптимизированный (
-O0) версии второй и третьей цели, чтобы увидеть, сколько времени тратится в оптимизаторе.
вы могли бы получить некоторую тягу с некоторым вариантом на
strace -e trace=process -f -r -ttt -T, по крайней мере для компиляторов, таких как g++, которые разбиты на множество процессов.
Comments