如何解读 Kcachegrind 图?

How to interpret Kcachegrind graphs?

我已经开始使用 Kcachegrind 进行性能分析。但是我不明白 GUI 和输出图。

例如这个调用图

SignatureIterator::iterate_parameters()我不明白9.25%指的是什么? 5 198x 表示 SignatureIterator::iterate_parameters() 调用了多少次 SignatureIterator::parse_type()Symbol::byte_at(int) const 中的 100% 是什么意思? 什么是 ELF Object

注:在官方文档中http://kcachegrind.sourceforge.net/html/CallGraph.html,还是不明白什么是the caller distance to the function

KCachegrind 中的所有可视化都围绕当前选定的函数展开,此处为 Symbol::byte_at()。通常,所选功能的百分比显示在总成本中(runtime/cycles 无论如何)。但是,如果启用 mode/tool 按钮 "Relative to parent",调用图中的百分比数字会 "zoomed up" 显示所选函数的 100%,以便更容易查看成本支出比率在其他功能中,相对于所选功能。

让我们假设成本(即在 KCachegrind 中选择的事件类型)是时间(以 CPU 周期或毫秒为单位 - 与百分比无关)。这可能更容易理解。

调用图中的百分比始终显示在选定函数 (Symbol::byte_at) 处于 活动 时花费在某些给定函数上的时间,即。在程序运行期间可以在调用堆栈上找到两个函数的时间。这在被调用方方向(向下Symbol::byte_at())和调用方方向(向上Symbol::byte_at())都有效。

往下看,这更容易理解:当 Symbol::byte_at() 处于活动状态时,处理器实际上有 24.14% 的时间在执行来自 Symbol::base() 的代码。另一次 (100% - 24.14%),Symbol::byte_at() 本身的代码是 运行.

选择的函数以上,可能有点棘手。 例如,SignatureIterator::iterate_parameters() 的 9.25% 表示在 Symbol::byte_at() 处于活动状态期间,9.25% 的时间是从 SignatureIterator::iterate_parameters() 间接调用的。同样,Symbol::byte_at() 有 11.27% 的时间是 运行 直接来自 SignatureIterator::parse_type()。也就是说,在所选函数的上方,函数直接父项中的百分比总和等于该函数的确切百分比,除非函数因低于 可见性阈值 (见上下文菜单)。