Как использовать KCachegrind и Callgrind для измерения только части моего кода?

Я хочу использовать Valgrind проанализировать мой код. Проблема в том, что у меня есть огромная последовательность запуска, которая меня не интересует.

Я нашел определения в Valgrind / callgrind.h это должно помочь мне:

  • CALLGRIND_START_INSTRUMENTATION
  • CALLGRIND_STOP_INSTRUMENTATION
  • CALLGRIND_DUMP_STATS

В соответствии с Эта статья Я должен выполнить Valgrind со следующими параметрами:

valgrind --tool=callgrind --instr-atstart=no ./application

Когда я это делаю, создаются два файла:

  • callgrind.out.16060
  • callgrind.out.16060.1

Затем я хочу использовать kcachegrind для визуализации моих результатов. Это прекрасно работает, но макрос для пропуска моей последовательности запуска, кажется, ничего не делает. Что мне нужно сделать, чтобы измерить производительность только в тех местах, где я хочу?

4

Решение

Я понял это сейчас, но я не уверен на 100%, почему. Я постараюсь немного описать мой код:

У меня есть класс Application, который отвечает за множество подсистем. В своей первоначальной попытке я попытался измерить производительность внутри приложения следующим образом:

int main(int argc, char *argv[])
{
Application a(argc, argv);
return a.exec();
}

void Application::Application(int &argc, char **argv)
{
m_pComplexSystem = new ComplexSystem();
m_pComplexSystem->configure();

CALLGRIND_START_INSTRUMENTATION;
m_Configurator->start();
}

Application::~Application()
{
CALLGRIND_STOP_INSTRUMENTATION;
CALLGRIND_DUMP_STATS;
m_pComplexSystem ->stop();

delete m_pComplexSystem;
m_pComplexSystem = 0;
}

По какой-то причине определения были проигнорированы, и я получил показатели производительности всего конструктора и всего, что было сделано в вызове configure () члена ComplexSystem.

Так что теперь я использую этот код, который, кажется, работает:

int main(int argc, char *argv[])
{
Application a(argc, argv);

CALLGRIND_START_INSTRUMENTATION;
int result = a.exec();
CALLGRIND_STOP_INSTRUMENTATION;
CALLGRIND_DUMP_STATS;
return result;
}

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

0

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

Других решений пока нет …

По вопросам рекламы [email protected]