У меня есть приложение 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
вызовами).