Мне нужно профилировать код, работающий на C ++ в Linux. Ребята, вы можете порекомендовать профайлеров?
Мне нужно профилировать код, работающий на C ++ в Linux. Ребята, вы можете порекомендовать профайлеров?
Ответы:
Используйте gprof.
Просто скомпилируйте с -pg
флагом (я думаю (но не уверен), что вам нужно отключить оптимизацию.) И используйте gprof для анализа файла gmon.out, который затем создаст ваш исполняемый файл.
например:
gcc -pg -o whatever whatever.c
./whatever
gprof whatever gmon.out
То же самое с g ++ и cpp.
valgrind - хорошо известный профилировщик Linux
Zoom from RotateRight ( http://www.rotateright.com ) - это то, что я использовал. Он имеет вид бабочек функций, и вы можете дважды щелкнуть любую функцию, чтобы погрузиться в исходный или asm-код. Выполните сборку с отладочной информацией (-g), чтобы увидеть исходный код, но вы все равно должны создавать и профилировать оптимизированный код.
-fno-omit-frame-pointer
для эффективного профилирования требуется создание кода .
Я фанат Oprofile . Он включает в себя установку модуля ядра и требует некоторого обучения, но он довольно мощный и очень хорошо работает для оптимизированных программ / программ без символов отладки.
Vtune - еще один очень мощный профилировщик от Intel. Я считаю, что версия для Linux бесплатна для некоммерческого программного обеспечения.
Существует также набор инструментов Valgrind , предложенный dfa. Callgrind, вероятно, будет тем, что вас больше всего интересует. Cachegrind (набор функций которого является подмножеством Callgrind) и Massif также интересны, но у меня нет опыта работы с последними.
Взгляните на KCacheGrind, который является графическим интерфейсом для valgrind и делает его действительно простым в использовании.
У Google также есть хороший профилировщик как часть google-perftools, которые включены в Debian / Ubuntu и, возможно, в другие дистрибутивы.
Взгляните на Sysprof . Скорее всего, в вашем дистрибутиве он уже есть.
Обратите внимание, что все упомянутые профилировщики работают лучше всего, если ваше приложение скомпилировано с указателями кадров. То есть вы должны использовать -fno-omit-frame-pointer в командной строке gcc.
prof
.
prof
любом случае имеет смысл начать : если я увижу, что f()
это наиболее проблемная функция статистически, я остановлю программу несколько раз, пока не займусь ею, f()
вместо того, чтобы просто начать со случайной функции, на которой я остановился первой.