Я пытаюсь профилировать (с 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 белый как снег:( и говорит нулевые инструкции...)
Я правильно использовал макросы/параметры? Любая идея того, что мне нужно изменить, чтобы получить ожидаемый результат?