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
Обратите внимание:
- Двойные кавычки вокруг опции.
- Список аргументов, включая круглые скобки.
- Пробел после запятой.