10

我想使用 callgrind 分析我的应用程序。现在,由于这需要很长时间,同时我在同一台机器上继续进行网络浏览、编译和其他密集任务。

我是否偏向分析结果?我期待,由于 valgrind 使用模拟 CPU,其他外部进程不应干扰 valgrind 的执行。我对吗?

4

1 回答 1

9

默认情况下,Callgrind 不会记录任何与时间相关的内容,因此您可以期望所有收集的指标(大部分)独立于机器上的其他进程。正如Callgrind 手册所述,

默认情况下,收集的数据包括执行的指令数量、它们与源代码行的关系、函数之间的调用者/被调用者关系以及此类调用的数量。

因此,Callgrind 报告的指标应该只取决于程序在(模拟的)CPU 上执行的指令 - 而不是这些指令需要多少时间。事实上,很多时候 Callgrind 的输出可能会有些误导,因为模拟 CPU 的运行可能与真实 CPU 不同(尤其是在分支预测方面)。在 ICCS 2004 上发表的Callgrind 论文也非常清楚地说明了这一点:

我们注意到模拟无法预测消耗的挂钟时间,因为这需要对微架构进行详细模拟。

然而,在任何情况下,模拟的 CPU 都不受真实 CPU 正在做什么的影响。原因很简单。就像你说的,你的程序根本不在你的机器上执行。相反,在运行时,Valgrind 会动态翻译您的程序,也就是说,它将二进制文件反汇编为模拟机器的“UCode”,添加分析代码(称为检测),然后生成执行模拟的二进制代码。添加分析代码使指令计数(在 Callgrind 中)、内存检查(在 Memcheck 中)和所有其他插件成为可能。

然而,其中存在着转折。自然地,程序在这种动态模拟中运行的独立程度是有限的。首先,您的程序可能与其他程序交互。虽然这样做所花费的时间无关紧要(因为它没有被考虑在内),但进程间通信的返回代码肯定会改变,这取决于系统中发生的其他事情。其次,大多数系统调用需要在未翻译的情况下运行,并且它们的返回码也可能发生变化——导致程序的执行路径不同,因此收集的指标略有不同。(顺便说一句,Calgrind 提供了一个选项来记录在系统调用期间花费的挂钟时间,这将始终受到系统中发生的其他事情的影响)。有关这些限制的更多详细信息,请参见Nicholas Nethercote 的博士论文(“动态二进制分析和仪器”)

于 2015-09-15T14:07:07.247 回答