准确的C / C + +时钟在一个多
我研究了几个主题,试图获得关于如何使用C或C ++制作可靠时钟的一些想法。 不过,我也看到一些函数使用处理器的刻度和每秒钟的刻度来计算最终结果,我认为这可能是一个像我拥有的自动超频的CPU问题。 我也看到其中一个在一段时间后重置,因此不是真的可靠。
我们的想法是制作一个(最好是跨平台的)时钟,就像游戏中的时钟一样,其精度优于一秒钟,以便能够在“当前会话”中添加已用时间并在最后保存时间的程序。 这将是计算在没有游戏内时钟的游戏机游戏上花费的时间,并且从长远来看可能将其整合到实际的PC游戏中。
它应该能够在不占用太多或所有CPU时间的情况下运行(或者单核用于多核CPU的时间),因为仅仅为时钟使用所有这些资源并且在具有自动 - 超频(否则可能导致不准确的结果)。
我想在当前实现这个功能的程序看起来像这样,但我可能会用C语言重新编写它(因为我必须回到学习如何使用C ++编写代码):
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
cout << "In game" << endl;
system("PAUSE");
return 0;
}
在附注中,我仍然需要摆脱特定于Windows的PAUSE功能,但我认为可以通过一个简单的“while(char!=' n')”循环来处理这个问题。
我已经浏览了一下:
(编辑:额外的研究,特别是对于C实现:
问题在于,不清楚某些提到的方法,如Boost或SDL2,是否适用于自动超频。
TL; DR :我应该使用哪种跨平台功能来制作精确的C / C ++精准计数器,这些计数器可以在多核和/或自动超频处理器上工作?
提前致谢。
std::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";
如果时钟检测本身是一个性能敏感的操作,那么您将不得不求助于特定于平台的技巧,其中最受欢迎的技术是直接读取CPU tick计数器(英特尔系列中的RDTSC
)。 这非常快速,而且在现代CPU上测量时间间隔的方法非常准确。