在运行中,返回的cpu时钟时间必须完全相同吗? 我有C++写的大项目。它可能有一些稳定性问题(即随机运行时),但我不确定。我知道,由于操作系统的多任务处理,以挂钟时间衡量的执行时间在不同的运行中可能会有所不同。但我不知道,对于稳定的程序来说,在相同输入的运行中,cpu时钟时间测量不同的执行时间是否正常。我试着使用time.h中的clock() boost::chrono:::process_user_cpu_clock::now();

在运行中,返回的cpu时钟时间必须完全相同吗? 我有C++写的大项目。它可能有一些稳定性问题(即随机运行时),但我不确定。我知道,由于操作系统的多任务处理,以挂钟时间衡量的执行时间在不同的运行中可能会有所不同。但我不知道,对于稳定的程序来说,在相同输入的运行中,cpu时钟时间测量不同的执行时间是否正常。我试着使用time.h中的clock() boost::chrono:::process_user_cpu_clock::now();,c++,boost,time,C++,Boost,Time,但在这两种情况下,我都能在图表上看到尖峰。我给你举一个这样的图的例子。这里Y轴-执行时间,X轴-相同程序在相同输入数据上的连续运行。红色图形-墙上的时钟时间,红色-cpu时钟时间,由时钟()从time.h开始计算 当然,我们假设我们的程序是稳定的,并且没有任何随机行为。那么,有可能吗?平台是Windows7 当然,我们假设我们的程序是稳定的,没有任何错误 随机行为。那么,有可能吗 若你们的程序运行在桌面上,这种可变性是典型的,我想说是不可避免的。中断、i/o通道活动和以太网本身消耗cpu时间,

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

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

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

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

我只看到过一个软件以您暗示的“稳定”方式运行的示例。这台计算机是一台SBC(单板计算机),有一个cpu(不是Intel或AMD),全是静态ram(因此没有动态ram,也没有刷新活动),没有以太网,但有两个固定速率的i/o通道,它在一个缩小的操作系统(不是linux,不是桌面操作系统)上运行一个程序。。。精确性就好像行为是简单的硬件逻辑

作为团队负责人,我认识到了这种不寻常的情况,所以我问她是否有时间安装逻辑分析仪和示波器。。。她证明了这两种工具在时间、边到边、消息到消息上都没有任何差异。对我来说,她的软件逻辑令人印象深刻地直截了当。在该系统中,如果您不需要中断,则根本不启用它

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


对。桌面不仅可能而且不可避免地会出现您所看到的各种变化(在时间上)


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

OP说使用的是Windows7,如果是MSVC说的话

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


这就是明显执行时间不一致的原因。

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

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

操作系统在内核上调度另一个线程? 即使该线程的时间不计入进程时钟,它也会从缓存中逐出工作数据,之后程序运行速度会变慢

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

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

硬件 在最近的系统上,您可能会使用turbo模式,该模式根据许多参数(包括温度)更改CPU频率

现代CPU有许多影响性能的启发式方法。例如,一个分支预测器根据过去的“经验”猜测你跳的分支。无论猜测是否正确,您的表现都会有很大的差异,如本文详细解释的。还有其他类似的组件,例如预取器

时钟精度 时钟也不完美。它们的分辨率和准确性有限。它们可以随时间漂移,也可以在不同的磁芯之间变化。正如风向标所示,时钟顶部的软件也可能出错


这是一个全面的列表,只是一些例子。

平台是什么?Linux
clock()
是处理器时间,Windows
clock()
AFAIK是墙上的时钟时间。没有单位、标记的轴、刻度等,图形是无用的。你真的担心微小的差异(在1.21到1.33之间,比如毫秒)吗?@sleeptightpupper y轴以秒为单位。钥匙上写着。我假设每次都是x,十分之一秒就是花生。操作系统将要做一些比运行代码更重要的事情,这会注入各种有趣的工件,使您的速度降低100毫秒以上。建议您通过一些真正的评测软件运行您的程序。检查一下,谢谢您的回答,我实际上也使用了GetProcessTimes,但它给了我几乎相同的结果。不管怎样,谢谢。很好的引证来解释事情