Что такое собственное время в C ++ Callgrind? - PullRequest
4 голосов
/ 06 февраля 2020

Я программирую на C ++ (на Linux), и недавно я начал использовать Valgrind / Callgrind для оптимизации моего кода. После прочтения пары учебных пособий кажется, что сосредоточиться на функциях с самой высокой «собственной» ценой - хорошая идея.

Я нашел две функции с высокой себестоимостью (обе они называются> 1M раз и имеют> 10% самостоятельной Стоимость каждого, относительно всего времени выполнения программы). В kcachegrind он показывает:

enter image description here

Callgrind, однако, не говорит мне, какая часть функции компенсирует эту себестоимость, что затрудняет оптимизацию код. Что такое себестоимость и как я могу попытаться уменьшить ее?

Насколько я понимаю, догадка состоит в том, что себестоимость включает в себя чтение / запись данных, ошибки кэширования, базовые c математические операции, копирование объектов в стеке (включая аргументы функции), et c. Как мне узнать, что это такое, прежде чем я могу обратиться к нему?

Спасибо

1 Ответ

0 голосов
/ 07 февраля 2020

Есть два способа, которыми Callgrind / Kcachegrind может представлять времена.

  1. % Относительный. Это значение по умолчанию, и все времена представлены в процентах от общего времени.
  2. Абсолют. Это подсчет «Оценка цикла». Это основано на различных «событиях», таких как чтение инструкций, пропуск кэша данных и т. Д. c. По умолчанию callgrind будет считать только чтение инструкций - вам нужно будет добавить опцию --cache-sim=yes для симуляции кэша и --branch-sim=yes для симуляции предсказателя ветвлений. Помните, что Valgrind имеет только простое моделирование кэша и элементарный предиктор ветвления.

«Self» - это время, затраченное на каждую функцию (не считая дочерних функций). «Включающий» - это время, проведенное в функции и всех дочерних функциях, которые она вызывает, транзитивно.

Если вы хотите увидеть разбивку времени, проведенного в функции, вам необходимо скомпилировать ваше приложение с отладочной информацией. , Затем, после запуска приложения в Callgrind и открытия выходного файла в Kcachegrind, вы можете посмотреть вкладку «Исходный код» в верхней правой панели. Это должно указывать время в каждой строке функции.

...