返回的cpu时钟时间必须在运行中完全相同吗?

时间:2016-05-25 18:04:39

标签: c++ boost time

我有用C ++编写的大项目。它可能有一些稳定性问题(即随机运行时间),但我不确定。据我所知,由于操作系统的多任务处理,执行时间(由挂钟时间测量)在运行之间可能会有所不同。但我不知道,稳定程序是否正常,在具有相同输入的运行中,CPU时钟时间测量的执行时间不同。我尝试使用time.h中的clock()

boost::chrono:::process_user_cpu_clock::now();

但在这两种情况下,我都会在图表上看到尖峰。我将举例说明此类图表。这里Y轴 - 执行时间,X轴 - 相同程序的连续运行,在相同的输入数据上。红色图表 - 挂钟时间,红色 - cpu时钟时间,由time.h(time.h)拍摄。

enter image description here

当然我们假设我们的程序是稳定的,并且没有任何随机行为。那么,有可能吗?平台是Windows 7。

3 个答案:

答案 0 :(得分:9)

  

当然我们假设我们的程序是稳定的,并且没有任何   随机行为。那么,有可能吗?

如果您的程序在桌面上运行,这种可变性是典型的,我认为这是不可避免的。中断,I / O通道活动和以太网本身消耗cpu时间,通常具有惊人的大“时间块”(参见tcp / ip SAR,缓存未命中等),其中大部分超出了程序的控制范围,而不是-synch与你的时间努力。

我只看到了一个软件以“稳定”方式运行的示例。那台计算机是一台SBC(单板计算机),有1个CPU(不是Intel或AMD),都是静态ram(所以没有动态ram,没有刷新活动),没有以太网,但有两个固定速率的i / o通道,它在缩小的操作系统上运行了一个程序(不是linux,而不是桌面操作系统)......精度就像行为简单的逻辑一样。

作为团队领导,我认识到这种不寻常,所以我问她是否有时间附加逻辑分析仪和示波器......她证明了这两种工具都没有显示任何时间差异,边缘到边缘,信息消息。对我来说,她的软件逻辑令人印象深刻。在该系统中,如果您不需要中断,则只是没有启用它。

桌面是一个非常不同的野兽...许多事情同时发生,其中大部分都不能被扼杀。

是。桌面具有您所看到的各种差异(在时间上),这不仅是可能的,而且是不可避免的。

然而,有可能实现你所暗示的稳定性,而不是在桌面上。它需要特殊的硬件和仔细的编码。

答案 1 :(得分:3)

OP表示正在使用Windows 7,如果是MSVC man page

  

时钟功能可以显示调用进程的挂钟时间   使用过。请注意,这与ISO C99不严格一致,   它指定净CPU时间作为返回值。要获得CPU时间,   使用Win32 GetProcessTimes函数。

这就是表面执行时间不一致的原因。

答案 2 :(得分:3)

这绝对正常。导致这种情况有很多影响。事实上,很难实现性能实验的可重复性。

缓存/内存

任何涉及内存的性能在很大程度上取决于是否使用了缓存:

操作系统安排核心上的另一个线程? 即使此线程的时间不计入您的进程时钟,它也可以从缓存中逐出您的工作数据,之后程序运行速度会变慢。

操作系统决定将您的线程移动到另一个核心?核心本地缓存不包含您的工作数据。在并行应用程序中,从线程到核心的映射会对性能产生巨大影响。

操作系统决定并行运行另一个内存密集型线程(在不同的内核上)?您的应用程序可用的共享缓存和内存带宽较少。

硬件

在最近的系统中,您可能会使用turbo模式 - 根据包括温度在内的许多参数来更改CPU频率。

现代CPU有许多影响性能的启发式方法。例如,一个分支预测器根据过去的经验猜测你跳过哪个分支?#34;。无论猜测是否正确,您的表现都会有很大差异,详见本epic answer。还有其他类似的组件,例如prefetchers。

时钟精度

时钟也不完美。它们的分辨率和准确度有限。它们可能会随着时间的推正如Weather Vane所指出的,时钟之上的软件也可能是错误的。

这是一份全面的清单,只是一些例子。