gperftools - измерять только одну функцию - PullRequest
1 голос
/ 01 апреля 2020

У меня есть приложение C ++ с потоками (через boost).

Я хочу профилировать только один поток с gperftools , потому что я прочитал, что он имеет минимальные издержки производительности и может работать в многопоточных приложениях.

Теперь ситуация очень проста, необходимо проанализировать только один поток.

Итак, я поместил ProfilerStart в основную функцию потока:

void run() {
  ProfilerStart("thread.log");

  initFunc1();

  while(mRunning) {
    loopFunc1();
    loopFunc2();
    loopFunc3();
  }

  endFunc1();

  ProfilerStop();
}

Перекомпилировал код и связал его с библиотекой * 1013. *

Я запустил программу, она создала thread.log, затем я преобразовал ее в формат callgrind (pprof --callgrind ./app thread.log > profile.callgrind).

Затем я открыл журнал callgrind с помощью kcachegrind , и он содержит вызовы отовсюду (то есть не только функции между ProfilerStart и ProfilerStop).

Это не беспокоит меня , но все же очень интересно, почему он содержит что-то, что находится снаружи?

Но реальная проблема заключается в том, что я не вижу ни одной из своих функций в графе вызовов, который изначально находится между ProfilerStart и Profiler Стоп.

Основная цель: проверить внутренние функции на предмет их времени (особенно в l oop).

При чистом ведении журнала я мог бы "измерить", что один l oop обычно занимает больше чем 10 мс, что огромно (между двумя loopFunc1 вызовами).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...