Как использовать Callgrind для профилирования определенных функций? - PullRequest
0 голосов
/ 19 мая 2018

После этого я обернул свои функции макросами CALLGRIND_xxx_INSTRUMENTATION.Тем не менее, я всегда получаю «недостаточно памяти».

Вот упрощенная версия моей программы, и callgrind по-прежнему бы не хватало памяти, даже если бы я мог запустить callgrind без использования макросов.

#include <cstdio>
#include <valgrind/callgrind.h>

void foo(int i)
{
  printf("i=%d\n", i);
}

int main()
{
   for (int i=0; i<1048576; i++)
   {
     CALLGRIND_START_INSTRUMENTATION;
     foo(i);
     CALLGRIND_STOP_INSTRUMENTATION;
   }
}

Чтобы запустить это, "valgrind --tool = callgrind --instr-atstart = no ./foo> foo.out".

Я сделал что-то не так?Пожалуйста помоги.Спасибо!

1 Ответ

0 голосов
/ 20 мая 2018

CALLGRIND_START_INSTRUMENTATION Типичный вариант использования - пропустить ввод кода запуска приложения.Если вы вызываете его в цикле, то это дорого обходится как в памяти, так и в процессоре, так как callgrind будет каждый раз переинструментировать код.

Если вас интересует только измерение некоторых функций, вам лучше начатьИнструментарий где-то перед циклом, а затем используйте CALLGRIND_TOGGLE_COLLECT до / после вызова функций, которые вас интересуют. Это будет использовать как меньше процессора, так и меньше памяти.

Если вы хотите сделать выше, вы должны тогдаиспользуйте опции --instr-atstart=no и --collect-at-start=no.Затем вы запускаете инструментарий в соответствующем месте вашей программы (например, после кода запуска / инициализации).Затем вы можете вставить вызовы к CALLGRIND_TOGGLE_COLLECT в интересующие вас функции.

Обратите внимание, что вместо изменения вашей программы для вызова CALLGRIND_TOGGLE_COLLECT для набора функций вы также можете использовать один или несколько разопция командной строки --toggle-collect=<function>

...