提问者:小点点

在带自动超频的多核处理器上提供精确的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;
}

顺便说一句,我仍然需要去掉窗口特有的暂停特性,但我认为可以通过一个简单的“while(char!='n')”循环来解决这个问题。

我已经浏览过的内容:

    中的定时器精确

(编辑:额外研究,特别是C实现:

    计算函数时间(以纳秒为单位 获取持续时间(整数毫秒和浮动秒)?(C++再次))/LI>

问题是,不清楚提到的一些方法,如Boost或SDL2,特别是在自动超频的情况下是否能正常工作。

TLDR:请问我应该使用什么跨平台功能来制作一个精确的,亚秒级的C/C++计数器,它可以在多核和/或自动超频处理器上工作?

提前谢谢你。


共1个答案

匿名用户

似乎就是您要寻找的内容。在大多数现代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滴答计数器(在Intel家族中为codeRDTSC/code>)。这是一种非常快的,在现代CPU上非常精确的测量时间间隔的方法。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(自动|超频|多核|处理器|提供|精确|c|c++|时钟)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?