Callgrind встроенные функции

Я профилирую свой код и уже нашел самую дорогую его часть. Однако это происходит в виде встроенной функции. Чтобы измерить воздействие, я заставил функцию не быть встроенной.

Теперь я хотел бы сообщить точные данные профилирования. Без inline у ​​нас огромные накладные расходы (функция в основном представляет собой один цикл, но она вызывается очень и очень часто).

Интересно, можно ли поручить valgrind обрабатывать определенную часть кода как функцию отдельно (например, makros CALLGRIND_START_INSTRUMENTATION, CALLGRIND_STOP_INSTRUMENTATION), не заставляя функцию не быть встроенной.

5

Решение

valgrind --tool=callgrind

в состоянии показать много деталей о том, где процессор (и другие расходы, такие как
в качестве кеша).
kcachegrind (инструмент визуализации) может легко показать различные затраты
(в том числе для встроенных функций).

Попробуйте запустить, например. с :

valgrind --tool=callgrind --dump-instr=yes --collect-jumps=yes

Примечание: чтобы посмотреть затраты на уровне инструкций, вы должны использовать kcachegrind

5

Другие решения

Возможно, вы могли бы вызвать макрос CALLGRIND_TOGGLE_COLLECT непосредственно перед вызовом вашей функции и в начале вашей функции, то же самое для выхода из вашей функции и сразу после вызова вашей функции.
Например.

int main()
{
CALLGRIND_TOGGLE_COLLECT;
myFunction();
CALLGRIND_TOGGLE_COLLECT;
}

__attribute__((noinline))
void myFunction()
{
CALLGRIND_TOGGLE_COLLECT;
//Do stuff
CALLGRIND_TOGGLE_COLLECT;
}

Должен сделать свое дело.

0

Я не уверен, что это то, что вы хотите, но я не уверен, что это не так 🙂
http://valgrind.org/docs/manual/cg-manual.html#cg-manual.overview

Кроме того, поскольку одно чтение кэша команд выполняется для каждой инструкции
выполнено, вы можете узнать, сколько инструкций выполнено за
линия, которая может быть полезна для традиционного профилирования.

-1