为啥我在探查器中获得的 C++ 运行时间不准确?
Posted
技术标签:
【中文标题】为啥我在探查器中获得的 C++ 运行时间不准确?【英文标题】:Why the C++ running time I get in profiler is not accurate?为什么我在探查器中获得的 C++ 运行时间不准确? 【发布时间】:2015-09-16 12:55:38 【问题描述】:我正在尝试分析 C++ 应用程序。我试过 gprof、HPCToolkit 和 ScoreP。我的问题是,对于不同的运行,我获得不同的运行时间,从一次执行到另一次执行的差异约为 10%(如 2.5 和 2.7 秒)。为什么?我记得当我在 Cray 系统上使用 CrayPat 时,不同的执行之间根本没有区别。 谢谢
ps:我在 debian 8 上
【问题讨论】:
那些分析器给你的是 CPU 时间而不是 run 时间?此外,普通家用计算机上的大多数分析器都是通过采样工作的,任何采样方法都不精确,具体取决于采样率。 你知道如何提高精度吗? @rosilho:最好不要期望挂钟运行时间的精确可重复性,因为除了最简单的计算机之外,所有计算机一次都在做不止一件事。如果您这样做的原因是为了寻找加速,这里有一个much better method。 是的,我知道内核会根据需要停止执行等等。事实上,我已经尝试将进程的好处降到最低,但即使运行时间发生了变化。我希望有一种方法可以绝对优先处理该过程,使其无法停止。 @rosilho:您进行分析是有原因的。有些人只是想知道这些数字,为了他们自己。大多数人都在努力寻找加快代码速度的方法(如果你愿意,也可以是“瓶颈”)。为此,总时间是多少并不重要。只需要找到负责大部分时间的活动。这些活动将优先出现在堆栈样本上无需测量。这就是the method I linked above 背后的秘密。 【参考方案1】:Andrei Alexandrescu 在一次演讲中提到,如今,对于现代处理器,您不应该期望在基准测试中具有可重复性。我认为你可以做两件事来让事情变得更可预测。首先,运行你的基准足够长的时间(我建议大约一分钟或接近一分钟)。还有一件事:确保电源管理已关闭(如果您在操作系统和使用它的机器上)。
【讨论】:
以上是关于为啥我在探查器中获得的 C++ 运行时间不准确?的主要内容,如果未能解决你的问题,请参考以下文章