Я хочу использовать Valgrind проанализировать мой код. Проблема в том, что у меня есть огромная последовательность запуска, которая меня не интересует.
Я нашел определения в Valgrind / callgrind.h это должно помочь мне:
В соответствии с Эта статья Я должен выполнить Valgrind со следующими параметрами:
valgrind --tool=callgrind --instr-atstart=no ./application
Когда я это делаю, создаются два файла:
Затем я хочу использовать kcachegrind для визуализации моих результатов. Это прекрасно работает, но макрос для пропуска моей последовательности запуска, кажется, ничего не делает. Что мне нужно сделать, чтобы измерить производительность только в тех местах, где я хочу?
Я понял это сейчас, но я не уверен на 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;
}
Хотя это не совсем то же самое, что и моя первоначальная попытка, сейчас я могу начать искать медленные функции.
Других решений пока нет …