Просто скомпилируйте с -pgфлагом (я думаю (но не уверен), что вам нужно отключить оптимизацию.) И используйте gprof для анализа файла gmon.out, который затем создаст ваш исполняемый файл.
Профилирование неоптимизированного кода немного бессмысленно, не правда ли? Точно так же код профилирования, который был сильно изменен с помощью -pg, часто вводит вас в заблуждение, оптимизируя неправильные места.
подумал, что valgrind был больше для проверки на утечку памяти .. Я пытаюсь увидеть, какие функции вызываются и т. д.
Шергилл
14
используйте инструмент набора под названием "callgrind"
dfa
2
Valgrind - это просто платформа для создания динамических инструментов. Хотя это стало синонимом Memcheck, инструмента, построенного на Valgrind. Callgrind неплохо умеет профилировать.
Zoom from RotateRight ( http://www.rotateright.com ) - это то, что я использовал. Он имеет вид бабочек функций, и вы можете дважды щелкнуть любую функцию, чтобы погрузиться в исходный или asm-код. Выполните сборку с отладочной информацией (-g), чтобы увидеть исходный код, но вы все равно должны создавать и профилировать оптимизированный код.
Просто попробовал эту программу, это действительно здорово! В настоящее время мой любимый профилировщик в Linux; однако стоит упомянуть, что -fno-omit-frame-pointerдля эффективного профилирования требуется создание кода .
Ник Рейман,
1
Ссылка кажется мертвой. Кто-нибудь знает, где (или если) его можно найти в другом месте?
Simon F
12
Я фанат Oprofile . Он включает в себя установку модуля ядра и требует некоторого обучения, но он довольно мощный и очень хорошо работает для оптимизированных программ / программ без символов отладки.
Vtune - еще один очень мощный профилировщик от Intel. Я считаю, что версия для Linux бесплатна для некоммерческого программного обеспечения.
Существует также набор инструментов Valgrind , предложенный dfa. Callgrind, вероятно, будет тем, что вас больше всего интересует. Cachegrind (набор функций которого является подмножеством Callgrind) и Massif также интересны, но у меня нет опыта работы с последними.
Ха-ха, правда. Я, наверное, не должен делать это так просто :) Это, конечно, не так просто, как «запускать программу под ним», как инструменты Vtune и Valgrind, но я чувствую, что вы довольно быстро к этому привыкаете.
Falaina
oprofile выглядит интересно - поддерживает ли он x86_64?
LiraNuna
К сожалению, VTune не бесплатен ни для каких целей.
rustyx
5
Взгляните на KCacheGrind, который является графическим интерфейсом для valgrind и делает его действительно простым в использовании.
Взгляните на Sysprof . Скорее всего, в вашем дистрибутиве он уже есть.
Обратите внимание, что все упомянутые профилировщики работают лучше всего, если ваше приложение скомпилировано с указателями кадров. То есть вы должны использовать -fno-omit-frame-pointer в командной строке gcc.
вы просто основываете свое суждение об узком месте на 10 образцах, собранных вами вручную, вместо 1000 образцов, собранных вами prof.
Дмитрий Григорьев
1
@DmitryGrigoryev: Верно, и это фактически говорит вам, что вам следует исправить. Статистическое объяснение здесь . Фактически, первая ошибка, которую делают люди, - это думать, что они ищут «узкое место», а не совершенно хороший, но расточительный код ;-)
Майк Данлэви,
Приятно читать, спасибо. Я полностью согласен с вашей точкой зрения, что оптимизировать намного проще, когда вы видите реальный вызов функции в отладчике. И я понимаю, что «узкое место» не означает «хорошую цель оптимизации», а только потенциальную. Тем не менее, я думаю, что в profлюбом случае имеет смысл начать : если я увижу, что f()это наиболее проблемная функция статистически, я остановлю программу несколько раз, пока не займусь ею, f()вместо того, чтобы просто начать со случайной функции, на которой я остановился первой.
Ответы:
Используйте gprof.
Просто скомпилируйте с
-pg
флагом (я думаю (но не уверен), что вам нужно отключить оптимизацию.) И используйте gprof для анализа файла 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 и, возможно, в другие дистрибутивы.
источник
gprof - это стандартный инструмент GNU для профилирования.
источник
Взгляните на Sysprof . Скорее всего, в вашем дистрибутиве он уже есть.
Обратите внимание, что все упомянутые профилировщики работают лучше всего, если ваше приложение скомпилировано с указателями кадров. То есть вы должны использовать -fno-omit-frame-pointer в командной строке gcc.
источник
Это то, что я использую.
источник
prof
.prof
любом случае имеет смысл начать : если я увижу, чтоf()
это наиболее проблемная функция статистически, я остановлю программу несколько раз, пока не займусь ею,f()
вместо того, чтобы просто начать со случайной функции, на которой я остановился первой.