【问题标题】:Is cpu clock time returned by have to be exactly same among runs?运行中返回的 cpu 时钟时间是否必须完全相同?
【发布时间】:2016-09-23 11:57:17
【问题描述】:

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

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

但在这两种情况下,我都会在图表上看到尖峰。我会给你一个这样的图表的例子。这里 Y 轴 - 执行时间,X 轴 - 相同程序在相同输入数据上的连续运行。红色图-挂钟时间,红色-cpu时钟时间,由clock()从time.h中获取

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

【问题讨论】:

  • 平台是什么? Linux clock() 是处理器时间,Windows clock() AFAIK 是挂钟时间。
  • 如果没有单位、标记轴、比例等,图表将毫无用处。例如,您真的担心微小的差异(例如毫秒)吗?
  • @sleeptightpupper y 轴以秒为单位。它在密钥中说。我只是假设 x 是每次运行。
  • 十分之一秒是花生。操作系统开始做一些对它来说比运行代码更重要的事情可能会注入各种有趣的工件,这些工件会使你的速度降低超过 100 毫秒。建议通过一些真正的分析软件来运行你的程序。

标签: c++ boost time


【解决方案1】:

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

如果您的程序在桌面上运行,这种可变性是典型的,我想说这是不可避免的。中断、i/o 通道活动和以太网本身消耗 cpu 时间,通常具有惊人的大“时间块”(请参阅​​ tcp / ip SAR、缓存未命中等),其中大部分超出您的程序控制范围而不是- 与您的计时工作同步。

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

作为团队负责人,我认识到不寻常,所以我问她是否有时间附上逻辑分析仪和示波器……她证明这两种工具在时间、边缘到边缘、消息到消息方面都没有任何差异。对我来说,她的软件逻辑非常直截了当。在那个系统中,如果你不需要中断,你根本就没有启用它。

桌面是一种截然不同的野兽......同时发生了这么多事情,其中​​大部分都无法抑制。


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

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

【讨论】:

    【解决方案2】:

    OP 说正在使用 Windows 7,如果那是 MSVC,man page

    时钟函数告诉调用进程多少挂钟时间 已使用。请注意,这并不严格符合 ISO C99, 它将净 CPU 时间指定为返回值。要获得 CPU 时间, 使用 Win32 GetProcessTimes 函数。

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

    【讨论】:

    • 嗯,感谢您的回答,我实际上也使用了 GetProcessTimes,但它给了我几乎相同的结果。无论如何,谢谢。
    • 很好的引文来解释事情
    【解决方案3】:

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

    缓存/内存

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

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

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

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

    硬件

    在最近的系统上,您可能使用涡轮模式 - 根据包括温度在内的许多参数改变 CPU 频率。

    现代 CPU 具有许多影响性能的启发式方法。例如,分支预测器根据过去的“经验​​”猜测您选择哪个分支进行跳跃。正如epic answer 中详细解释的那样,无论该猜测是否正确,您的表现都会有很大差异。还有其他类似的组件,例如预取器。

    时钟精度

    时钟也不完美。它们的分辨率和准确性有限。它们可能会随着时间的推移而漂移 - 或在内核之间有所不同。正如 Weather Vane 所指出的,时钟上的软件也可能出错。

    到目前为止,这是一个全面的列表,只是一些示例。

    【讨论】:

      猜你喜欢
      • 2022-06-27
      • 2020-05-15
      • 2019-01-17
      • 2020-03-27
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      • 2018-10-27
      • 1970-01-01
      相关资源
      最近更新 更多