Pao*_*o M 9 profiling valgrind callgrind
我想用callgrind来描述我的应用程序.现在,由于需要很长时间,同时我继续在同一台机器上进行网页浏览,编译和其他密集型任务.
我是否偏向分析结果?我期待这一点,因为valgrind使用模拟CPU,其他外部进程不应该干扰valgrind执行.我对吗?
默认情况下,Callgrind不会记录与时间相关的任何内容,因此您可以预期所有收集的指标(主要)与计算机上的其他进程无关.正如Callgrind手册所述,
默认情况下,收集的数据包括执行的指令数,它们与源行的关系,函数之间的调用者/被调用者关系以及此类调用的数量.
因此,Callgrind报告的度量标准应仅取决于程序在(模拟)CPU上执行的指令 - 而不取决于此类指令所花费的时间.实际上,很多时候Callgrind的输出可能有些误导,因为模拟的CPU可能与真实的CPU不同(特别是在分支预测时).在ICCS 2004上发表的Callgrind论文也非常清楚:
我们注意到模拟不能预测消耗的挂钟时间,因为这需要详细模拟微架构.
但是,在任何情况下,模拟CPU都不受实际CPU正在执行的操作的影响.原因很简单.就像你说的那样,你的程序根本没有在你的机器上执行.相反,在运行时,Valgrind会动态转换您的程序,也就是说,它将二进制文件反汇编为模拟机器的"UCode",添加分析代码(称为检测),然后生成执行模拟的二进制代码.分析代码的添加使得指令计数(在Callgrind中),内存检查(在Memcheck中)和所有其他插件成为可能.
然而,这就是扭曲.当然,程序在这种动态模拟中可以运行的程度是有限的.首先,您的程序可能与其他程序交互.虽然这样做所花费的时间是无关紧要的(因为它没有考虑到),但是进程间通信的返回代码肯定会发生变化,这取决于系统中还有什么.其次,大多数系统调用需要运行未翻译,并且它们的返回代码也可以更改 - 导致程序的执行路径不同,因此收集的指标略有不同.(另外,Calgrind提供了一个选项来记录在系统调用期间花费的挂钟时间,这将永远受到系统中其他内容的影响).有关这些限制的更多详细信息,请参阅Nicholas Nethercote博士论文("动态二元分析与仪器").