Callgrind: Профилируйте определенную часть моего кода.

Я пытаюсь профилировать (с Callgrind) конкретную часть моего кода, удаляя шум и вычисления, которые меня не волнуют. Вот пример того, что я хочу сделать:

for (int i=0; i<maxSample; ++i) {
    //Prepare data to be processed...
    //Method to be profiled with these data
    //Post operation on the data
}

Мой прецедент - это регрессионный тест, я хочу убедиться, что этот метод все еще достаточно быстрый (что-то вроде менее 10% дополнительных инструкций с момента последней реализации). Вот почему я хотел бы получить более чистый выход из Callgrind. (Мне нужен цикл for, чтобы иметь значительное количество обработанных данных, чтобы иметь хорошую оценку поведения метода, который я хочу профилировать)

Моя первая попытка заключалась в том, чтобы изменить код на:

for (int i=0; i<maxSample; ++i) {
    //Prepare data to be processed...
    CALLGRIND_START_INSTRUMENTATION;
    //Method to be profiled with these data
    CALLGRIND_STOP_INSTRUMENTATION;
    //Post operation on the data
}
CALLGRIND_DUMP_STATS;

Добавление макросов Callgrind для управления прибором. Я также добавил опции -instr-atstart = no, чтобы быть уверенным, что я проецирую только ту часть кода, которую я хочу...

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

Я также пробовал

for (int i=0; i<maxSample; ++i) {
    //Prepare data to be processed...
    CALLGRIND_TOGGLE_COLLECT;
    //Method to be profiled with these data
    CALLGRIND_TOGGLE_COLLECT;
    //Post operation on the data
}
CALLGRIND_DUMP_STATS;

(или опция -toggle-collect = "myMethod" ) Но Callgrind вернул мне журнал без какого-либо вызова (KCachegrind белый как снег:( и говорит нулевые инструкции...)

Я правильно использовал макросы/параметры? Любая идея того, что мне нужно изменить, чтобы получить ожидаемый результат?

Ответ 1

Мне удалось решить эту проблему... Это была проблема с конфигурацией:

Я сохранил код

for (int i=0; i<maxSample; ++i) {
    //Prepare data to be processed...
    CALLGRIND_TOGGLE_COLLECT;
    //Method to be profiled with these data
    CALLGRIND_TOGGLE_COLLECT;
    //Post operation on the data
}
CALLGRIND_DUMP_STATS;

Но запустил callgrind с - collect-atstart = no (и без -instr-atstart = нет!!!), и он работал отлично, в разумные сроки (~ 1 мин).

Проблема с инструментами START/STOP заключалась в том, что callgrind выгружает файл (callgrind.out. # number) на каждой итерации (каждый STOP), поэтому он действительно очень медленный... (после 5 минут у меня было всего 5000 прогонов для 300 000 итераций... не подходит для регрессионного теста).

Ответ 2

Параметр toggle-collect очень разборчив в том, как вы указываете метод для использования в качестве триггера. Вам также нужно указать список своих аргументов, и даже пробелы должны соответствовать! Используйте имя метода точно так, как оно появляется в выводе callgrind. Например, я использую эту интрокацию:

$ valgrind 
    --tool=callgrind 
    --collect-atstart=no 
    "--toggle-collect=ctrl_simulate(float, int)"
    ./swaag

Обратите внимание:

  • Двойные кавычки вокруг опции.
  • Список аргументов, включая круглые скобки.
  • Пробел после запятой.