在多次运行中获得一致的 callgrind 输出

Getting consistent callgrind output over multiple runs

我一直在使用 valgrind 对 C++ 代码库进行一些分析,根据我的理解,它正在对单个调用执行 采样 以构建其分析数据。因此,我可以使用类似这样的方法对同一个应用程序进行两次分析:

valgrind --tool=callgrind myprogram.exe

每次都得到不同的结果。例如,我最后两个 运行s 在底部给了我以下输出:

==70741== 
==70741== Events    : Ir
==70741== Collected : 196823780
==70741== 
==70741== I   refs:      196,823,780

==70758== 
==70758== Events    : Ir
==70758== Collected : 195728098
==70758== 
==70758== I   refs:      195,728,098

这对我来说完全有意义。但是,我目前正在优化我的代码库,我希望能够进行更改并确定它是否能提高性能。由于抽样,似乎单独使用 运行ning callgrind 是不够的,因为我可以在每个 运行 上获得不同的数字。因此,很难确定我的最新 运行 只是由于 运行dom 采样而更快 运行,还是我的更改实际上产生了显着差异(在统计意义上,为什么不呢?)。

我的问题是:有没有一种方法可以强制 callgrind 在其采样中保持一致?或者,是否有一些更合适的高级工具可以让我了解重构如何影响性能?我目前正在 Mac OSX Sierra 开发。

callgrind 不使用采样技术。相反,它精确地“计算”执行的指令。因此,如果一个程序在 callgrind 下 运行 两次并且完全 相同,那么它会给出相同的结果。但是,一旦您的程序正在做一些重要的事情(例如使用大量库),这些库可能会做一些略有不同的事情,具体取决于例如关于时钟或系统负载或 env 的内容或...

所以,您看到的差异不是 callgrind 造成的,而是因为您的程序 and/or 它使用的库每次做的事情都略有不同。

您可以使用一些 callgrind 输出文件可视化或报告工具,例如 kcachegrind 来分析 2 运行s 之间的差异。然后您可能会看到这些差异的根源是什么并消除它们。否则,您应该能够通过仅查看您感兴趣的功能的成本来确定更改的效果。