具有自动超频的多核处理器上的准确C / C ++时钟?

问题描述 投票:4回答:1

我已经研究了几个主题,试图了解如何使用C或C ++制作可靠的时钟。但是,我也看到一些函数使用了处理器的滴答和每秒滴答来计算最终结果,我认为这可能是一个带有自动超频的CPU的问题,就像我的那个。我也看到其中一个在一段时间后复位,因此不太可靠。

这个想法是制作一个(最好是跨平台的)时钟,就像游戏中的一个,精度优于一秒钟,以便能够在“当前会话”中添加已用时间和最后节省的时间该计划。这将计算在没有游戏时钟的控制台游戏上花费的时间,并且从长远来看可能将其集成到实际的PC游戏中。

它应该能够在不占用太多或全部CPU时间的情况下运行(或者单核心用于多核CPU的时间),因为仅仅为时钟使用所有这些资源是非常糟糕的,并且在具有自动的系统上也是如此-overclock(否则会导致不准确的结果)。

我想要实现此功能的程序目前看起来像这样,但我可能会用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 ++中制作一个精确的亚秒级精确计数器,可以在多核和/或自动超频处理器上运行?

提前致谢。

c++ c performance cross-platform clock
1个回答
2
投票

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滴答计数器(英特尔家族中的RDTSC)。这是非常快的,并且在现代CPU上非常准确地测量时间间隔。

© www.soinside.com 2019 - 2024. All rights reserved.