准确的信用证++;具有自动超频功能的多核处理器上的时钟? 我已经研究了几个主题,试图得到一些关于如何用C或C++制作可靠时钟的想法。然而,我也看到一些函数使用处理器的滴答声和每秒滴答声来计算最终结果,我认为这可能是一个问题,在一个像我这样的自动超频CPU上。我还看到其中一个在一段时间后重置,因此并不真正可靠

准确的信用证++;具有自动超频功能的多核处理器上的时钟? 我已经研究了几个主题,试图得到一些关于如何用C或C++制作可靠时钟的想法。然而,我也看到一些函数使用处理器的滴答声和每秒滴答声来计算最终结果,我认为这可能是一个问题,在一个像我这样的自动超频CPU上。我还看到其中一个在一段时间后重置,因此并不真正可靠,c++,c,performance,cross-platform,clock,C++,C,Performance,Cross Platform,Clock,其想法是制作一个(最好是跨平台)类似游戏中的时钟,其精度优于一秒,以便能够将“当前会话”中经过的时间与程序结束时保存的时间相加。这将是计算在没有游戏内时钟的游戏机上花费的时间,从长远来看,也许会将其集成到实际的PC游戏中 它应该能够在不占用太多或全部CPU时间(或多核CPU占用单核时间)的情况下运行,因为仅将所有这些资源用于时钟以及具有自动超频功能的系统(否则可能导致不准确的结果)是非常糟糕的 我想在其中实现此功能的程序目前看起来是这样的,但我可能会用C重新编写它(因为我必须回去学习如何用C++

其想法是制作一个(最好是跨平台)类似游戏中的时钟,其精度优于一秒,以便能够将“当前会话”中经过的时间与程序结束时保存的时间相加。这将是计算在没有游戏内时钟的游戏机上花费的时间,从长远来看,也许会将其集成到实际的PC游戏中

它应该能够在不占用太多或全部CPU时间(或多核CPU占用单核时间)的情况下运行,因为仅将所有这些资源用于时钟以及具有自动超频功能的系统(否则可能导致不准确的结果)是非常糟糕的

我想在其中实现此功能的程序目前看起来是这样的,但我可能会用C重新编写它(因为我必须回去学习如何用C++编写代码):

#包括
#包括
使用名称空间std;
int main()
{

coutstd::chrono::high_resolution_clock
似乎就是您想要的。在大多数现代CPU上,它将是稳定的单调递增时钟,不会受到CPU超频的影响

请记住,它不能用来告诉时间。它只适用于告诉时间间隔,这是一个很大的区别。例如:

using clock = std::chrono::high_resolution_clock;
auto start = clock::now();
perform_operation();
auto end = clock::now();
auto us = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
std::cout << "Operation took " << us << " microseconds.\n";
使用时钟=std::chrono::高分辨率时钟;
自动启动=时钟::现在();
执行_操作();
自动结束=时钟::现在();
auto-us=std::chrono::duration_cast(end-start).count();

std::cout听起来像你想要的。投票支持所有的研究听起来它可能是我真正想要的…如果我正确理解了文档,你可以设置一个独立于CPU时钟的特定周期,对吗?如果是这样的话,那么它可能就是完美的。
std::chrono::stable_clock
et设置为任意值。在任何给定点,它都会告诉您时钟的值。由您在间隔的开始和结束时测量时钟,并相应地计算经过的时间。@Coroice
std::chrono::stable_clock
是一种单调递增的时钟,不受CPU速度等外部因素的影响或者用户调整日期/时间设置或类似设置-是的。看来chrono库中的高分辨率时钟和稳定时钟可能是我需要的;唯一的“问题”之后可能是从秒到分和小时的转换。非常感谢!与
std::chrono::high_resolution_clock
vs
std::chrono::Stadible_clock
相比,高分辨率时钟的问题在于前者不能保证永远不会在时间上倒转。按照我阅读OPs问题的方式,他们想要一个不受影响的稳定增加的时钟由用户调整当前日期/时间或CPU更改频率等进行ted。
稳定的时钟
仅此而已,但
高分辨率的时钟
不一定(保证是)@Coroice时间单位之间的转换很简单。正如我所说的@JesperJuhl,在大多数现代平台上,高分辨率时钟是单调增加的(实际上是稳定时钟的同义词)。gcc别名为
高分辨率时钟
系统时钟
。其他所有人(libc++/VS)将其别名为
稳定时钟
。我建议您选择
系统时钟
稳定时钟
,以使代码更便于携带。
系统时钟
如果您需要将时间与人类日历(即挂钟)关联,则很好如果您只需要两个时间点之间的持续时间和/或时间单调前进的保证(即秒表),则稳定的时钟是好的。
using clock = std::chrono::high_resolution_clock;
auto start = clock::now();
perform_operation();
auto end = clock::now();
auto us = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
std::cout << "Operation took " << us << " microseconds.\n";