Получение согласованного вывода callgrind за несколько запусков - PullRequest
0 голосов
/ 10 июля 2020

Я использовал valgrind для профилирования кодовой базы C ++ и, насколько я понимаю, выполняет выборку отдельных вызовов для создания данных своего профиля. В результате я могу дважды профилировать одно и то же приложение, используя что-то вроде этого:

valgrind --tool=callgrind myprogram.exe

, и каждый раз получать разные результаты. Например, мои последние два прогона дали мне следующий результат внизу:

==70741== 
==70741== Events    : Ir
==70741== Collected : 196823780
==70741== 
==70741== I   refs:      196,823,780

и

==70758== 
==70758== Events    : Ir
==70758== Collected : 195728098
==70758== 
==70758== I   refs:      195,728,098

, все это имеет для меня полный смысл. Однако в настоящее время я оптимизирую свою кодовую базу и хочу внести изменения и определить, действительно ли они улучшают производительность. Из-за выборки кажется, что одного запуска callgrind будет недостаточно, поскольку я могу получать разные числа при каждом запуске. В результате было бы трудно определить, был ли мой последний прогон быстрее просто из-за случайной выборки, или же мои изменения действительно имели существенное значение (в статистическом смысле, почему бы и нет?).

Мой вопрос is: Есть ли способ заставить callgrind быть последовательным в его выборке? Или есть более подходящий инструмент более высокого уровня, который позволил бы мне понять, как рефакторинг влияет на производительность? В настоящее время я разрабатываю Ma c OSX Sierra.

1 Ответ

0 голосов
/ 11 июля 2020

callgrind не использует технику выборки. Вместо этого он точно «считает» выполненные инструкции. Итак, если программа запускается дважды под callgrind и делает точно то же самое, то она даст тот же результат. Однако, если ваша программа выполняет нетривиальные функции (например, использует множество библиотек), такие библиотеки могут выполнять несколько иные действия, например, в зависимости от часов, загрузки системы или содержимого env или ...

Итак, различия, которые вы видите, не связаны с callgrind, это потому, что на самом деле ваша программа и / или библиотеки, которые она использует, каждый раз делают немного разные вещи.

Вы можете использовать визуализацию выходного файла callgrind или инструменты отчетности, такие как kcachegrind, для анализа разницы между двумя запусками. Затем вы можете увидеть, в чем причина этих различий, и устранить их. В противном случае вы сможете определить эффект ваших изменений, взглянув только на стоимость интересующих вас функций.

...