callgrind profiling是否受其他进程的影响?

时间:2015-09-11 10:48:13

标签: profiling valgrind callgrind

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

我是否偏向性能分析结果?我期待这一点,因为valgrind使用模拟CPU ,其他外部进程应该不干涉valgrind执行。我是对的吗?

1 个答案:

答案 0 :(得分:8)

默认情况下,Callgrind不会记录与时间相关的任何内容,因此您可以预期所有收集的指标(主要)与计算机上的其他进程无关。正如Callgrind manual所述,

  

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

因此,Callgrind报告的指标应仅取决于程序在(模拟)CPU上执行的指令 - 而不取决于此类指令需要多长时间。实际上,很多时候Callgrind的输出可能会有些误导,因为模拟的CPU可能与真实的CPU不同(特别是在分支预测时)。 Callgrind paper presented at ICCS 2004对此也非常清楚:

  

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

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

然而,其中存在扭曲。 当然,程序在这种动态模拟中可以运行的程度是有限的。 首先,您的程序可能与其他程序交互。 虽然这样做所花费的时间是无关紧要的(因为它没有考虑到),但是进程间通信的返回代码肯定会发生变化,这取决于系统中还有什么。 其次,大多数系统调用需要运行未翻译,并且它们的返回代码也可以更改 - 导致程序的执行路径不同,因此收集的指标略有不同。 (另外,Calgrind提供了一个选项来记录在系统调用期间花费的挂钟时间,这将永远受到系统中其他内容的影响)。 有关这些限制的更多详细信息,请参阅PhD Dissertation of Nicholas Nethercote ("Dynamic Binary Analysis and Instrumentation")