【发布时间】:2017-10-28 18:20:10
【问题描述】:
我第一次尝试使用 Callgrind/Kcachegrind 来分析我的 C++ 应用程序,我注意到需要更多时间的两个函数是:
- (50% 自我)和
- do_lookup_x(15% 自己)
现在,根据我的理解,周期 1 与递归调用函数所花费时间的估计有关,但我不太清楚我应该如何解释在这里花费的如此长的时间。如果有一些周期,我想看看哪个函数被调用得更频繁,最后占用更多的 CPU 时间。如果我禁用循环检测(视图->循环检测),那么循环 1 会消失,但“自我”时间总计约为 60%,我不确定这是最好的做法。 关于 do_lookup_x 我完全一无所知...
你能解释一下我应该如何解释这些结果吗?
提前致谢。
【问题讨论】:
-
Self时间应该计算正确。 callgrind 中的循环检测是启发式的,因为 callgrind/cachegrind 输出没有完整的调用堆栈,它只记录被调用者-调用者对。perf和google-perftools(pprof) 都更适合函数调用堆栈捕获(当且仅当您的项目启用了-fno-omit-frame-pointer选项)并且没有像 Kcachegrind 这样漂亮的 GUI。perf record -g输出可以用github.com/jrfonseca/gprof2dot 作为图片查看。另外:如果您有 >10% 的do_lookup_x- 您的程序太短而无法分析;试试LD_BIND_NOW=1 ./prg -
@osgx 谢谢,但我真正的问题是:我可以安全地忽略第 1 周期占用的 50% 并只分析其他函数吗?还是说有什么奇怪的事情正在发生?
-
Alessandro,哪个时间被周期“占用”了 50%? “包括。”时间可能不正确,自我时间应该是正确的(并且仅针对实际功能设置)。检查列在最前面的表,使用按自时间排序。 (您也可以张贴屏幕截图,并显示您的循环图表)
-
@osgx,50% 是“self”,而 96% 是“incl”。完整地说,我正在运行 OMNeT++ 模拟
-
在 Kcachegrind 中关闭循环检测并再次检查“self”次数。
标签: c++ profiling callgrind kcachegrind