评估callgrind呼叫配置文件的工具?

时间:2009-11-20 15:58:00

标签: profiling evaluation callgrind

以某种方式与this question相关,您建议使用哪个工具来评估使用callgrind创建的性能分析数据?

它不必具有图形界面,但它应该以简洁,清晰和易于理解的方式准备结果。我知道例如kcachegrind,但此程序缺少某些功能,例如所显示表格的数据导出或只是从显示屏复制行。

2 个答案:

答案 0 :(得分:1)

多年前我写了一个在DOS下运行的探查器。

如果您正在使用KCacheGrind,那么我将拥有它。写它可能不是太难,或者你可以手工完成。

KCacheGrind有一个工具栏按钮“强制转储”,您可以使用它随机手动触发转储。在等待程序的时间间隔内随机或伪随机时间捕获堆栈跟踪是该技术的核心。

不需要很多样本 - 通常绰绰有余20。如果瓶颈成本很高,比如超过50%,那么5个样本就足够了。

样品的处理非常简单。每个堆栈跟踪由一系列代码行(实际上是地址)组成,除了最后一行之外的所有代码都是函数/方法调用。

  • 收集样本上显示的所有代码行的列表,并删除重复项。

  • 对于每行代码,计算它出现的样本分数。例如,如果您采用20个样本,并且代码行出现在其中3个样本中,即使它在某些样本中出现多次(由于递归),计数也是3/20或15%。这是对每种陈述成本的直接衡量。

  • 显示最昂贵的100行代码。你的瓶颈在于该列表。

我通常对这些信息做的是选择成本高的行,然后手动获取堆栈样本直到它出现(或查看我已经获得的那些),并问自己“为什么它在做那条线代码,不仅仅是局部意义上的,而是全球意义上的。“另一种说法是“全球意义上的程序试图在采集样本时的时间片上完成”。我问这个的原因是因为它告诉我是否真的有必要花费这条线的成本。

我不想批评人们开发剖析仪的所有伟大工作,但遗憾的是,在这个问题上存在许多根深蒂固的神话,包括:

  • 对于大量样品进行精确测量非常重要。相反,重点应放在发现瓶颈上。精确测量不是先决条件。对于典型的瓶颈,成本在10%到90%之间,测量结果可能非常粗糙。

  • 这些功能比代码行更重要。如果您发现代价高昂的功能,您仍然需要在其中搜索作为瓶颈的线路。这些信息就在那里,在堆栈跟踪中 - 无需寻找它。

  • 您需要区分CPU和挂钟时间。如果你正在等待它,它的挂钟时间(手表时间?)。例如,如果您有一个由无关I / O组成的瓶颈,您是否要忽略它,因为它不是CPU时间?

  • 独家时间和包容时间之间的区别很有用。只有你的计时功能才有意义,你想知道时间是否花费在被叫人身上。如果你看一下代码行,唯一重要的是包容时间。换句话说,即使只调用微码,每条指令都是一条调用指令。

  • 递归很重要。这是无关紧要的,因为它不影响线路所在的样本分数,因此负责。

  • 行或函数的调用计数很重要。无论是快速调用还是调用太多次,或调用速度慢,调用一次,成本就是它使用的时间百分比,这就是堆栈样本估计的内容。

  • 抽样表现很重要。我不介意在继续之前拿一个堆栈样本并查看它几分钟,假设不会使瓶颈移动。

Here's更完整的解释。

答案 1 :(得分:1)

有一些用于处理callgrind数据的CLI工具:

callgrind_annotate

和cachegrind工具,可以显示来自callgrind.out的一些信息

cg_annotate