为啥我在探查器中获得的 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++ 运行时间不准确?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 性能探查器中的错误结果

Qt 创建器中的白色窗口

如何在 Eclipse 探查器中显示 java.lang.* 对象分配?

无法从 sklearn MLP 分类器中获得良好的准确性

如何知道 Python 编程是不是在探查器下运行?

为啥当我在 MD5 哈希中转换相同的 C++ 字符串时,每次都会获得不同的输出?