2015-06-08 50 views
2

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

例如,对于这个调用图

enter image description here 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

+0

函数A调用函数B之间的距离是A-> C-> T-> B之间的子函数的数量,在这种情况下A和B之间的距离是2. – Bionix1441

回答

7

KCachegrind中的所有可视化都以当前选定的函数为中心,这里是Symbol::byte_at()。通常,所选函数的百分比数字与总成本(有史以来的运行时间/周期)相关。但是,如果启用模式/工具按钮“相对于父级”,则调用图表中的百分比数字会“缩小”以显示所选功能的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()被称为从SignatureIterator::parse_type()直接运行的时间的11.27%。也就是说,在所选函数的上方,函数的直接父项中的百分比总是与该函数的确切百分比相加,除非由于低于可见性阈值(请参见上下文菜单)而使功能从可视化中断, 。

+0

非常好的解释,谢谢。唯一缺少的东西(以及我还没完全掌握的那个)是_recursive_调用旁边的栏。他们似乎没有遵循解释的模式,因为它们的价值大于所选函数的价值 - 在上述方案中这是不可能的。 – stefanct