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



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

744   5  

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

    Ничего не найдено.