在多次运行中获得一致的callgrind输出
Getting consistent callgrind output over multiple runs
我一直在使用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来分析两次运行之间的差异。然后,您可能会看到这些差异的来源并消除它们。否则,您应该能够通过只查看您感兴趣的功能的成本来确定更改的效果。
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 集合上的输出迭代器:assign和increment迭代器
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 为什么rk4.do_step不输出C++中的初始条件
- 在多次运行中获得一致的callgrind输出
- 带有回溯的callgrind配置文件输出