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

Getting consistent callgrind output over multiple runs

本文关键字:callgrind 输出 运行      更新时间:2023-10-16

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

valgrind --tool=callgrind myprogram.exe

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

==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

这一切对我来说都很有意义。然而,我目前正在优化我的代码库,我希望能够做出改变,并确定它是否能提高性能。由于采样的原因,似乎单独运行callgrind是不够的,因为我每次运行都可以得到不同的数字。因此,很难确定我最近的跑步是因为随机采样而跑得更快,还是我的改变真的产生了显著的影响(从统计意义上来说,为什么不呢?(。

我的问题是:有没有一种方法可以让老茧研磨在采样时保持一致?或者,有没有更合适的更高级的工具可以让我了解重构是如何影响性能的?我目前正在Mac OSX Sierra进行开发。

callgrind不使用采样技术。相反,它恰恰";计数";执行的指令。因此,如果一个程序在callgrind下运行两次,并且完全相同,那么它将给出相同的结果。然而,一旦您的程序正在做一些非琐碎的事情(例如,使用许多库(,这些库可能会做一些稍微不同的事情,这取决于时钟或系统负载或env的内容,或者。。。

因此,您看到的差异并不是由于callgrind,而是因为您的程序和/或它所使用的库每次都在做稍微不同的事情。

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