具有自动超频功能的多核处理器上的准确 C/C++ 时钟?
Accurate C/C++ clock on a multi-core processor with auto-overclock?
我研究了几个主题,试图获得一些关于如何使用 C 或 C++ 制作可靠时钟的想法。然而,我也看到一些函数使用处理器的滴答声和每秒滴答声来计算最终结果,我认为这可能是 CPU 上的一个问题,就像我拥有的那样自动超频。我也看到其中一个过段时间就重置了,所以不是很靠谱。
我们的想法是制作一个(最好是跨平台的)时钟,就像游戏中的时钟一样,精度优于一秒,以便能够在 "current session" 中添加经过的时间程序结束时节省的时间。这将是计算在没有游戏时钟的主机游戏上花费的时间,并且从长远来看 运行 也许将其集成到实际的 PC 游戏中。
它应该能够 运行 而不会占用太多或全部 CPU 的时间(或多核 CPUs 的单核时间),因为它将所有这些资源仅用于时钟以及在具有自动超频的系统上(否则可能导致不准确的结果)使用所有这些资源将是非常糟糕的。
我想在其中实现此功能的程序目前看起来像这样,但我可能会用 C 重新编写它(因为我必须重新学习如何用 C++ 编写代码):
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
cout << "In game" << endl;
system("PAUSE");
return 0;
}
附带说明一下,我仍然需要摆脱 Windows 特定的 PAUSE 功能,但我认为可以通过简单的 "while (char != '\n')" 循环来解决。
我已经浏览过的内容:
- Using clock() to measure execution time
- Calculating elapsed time in a C program in milliseconds
- Time stamp in the C programming language
- Execution time of C program
- C: using clock() to measure time in multi-threaded programs
- Is gettimeofday() guaranteed to be of microsecond resolution?
- How to measure time in milliseconds using ANSI C?
- C++ Cross-Platform High-Resolution Timer
- Timer function to provide time in nano seconds using C++
- How to measure cpu time and wall clock time?
- How can I measure CPU time and wall clock time on both Linux/Windows?
- how to measure time?
- resolution of std::chrono::high_resolution_clock doesn't correspond to measurements
- C++ How to make timer accurate in Linux
- http://gameprogrammingpatterns.com/game-loop.html
- clock() accuracy
- std::chrono doesn't seem to be giving accurate clock resolution/frequency
(编辑:额外研究,特别是对于 C 实现:
- Cross platform C++ High Precision Event Timer implementation(没有真正的答案)
- Calculating Function time in nanoseconds in C code (Windows)
- How to print time difference in accuracy of milliseconds and nanoseconds?(可能是 C 实现的最佳答案)
- How to get duration, as int milli's and float seconds from <chrono>?(又是 C++))
问题是,尚不清楚某些提到的方法(例如 Boost 或 SDL2)是否能正常运行,尤其是在自动超频的情况下。
TL;DR : 我应该使用什么跨平台函数来在 C/C++ 中制作一个可以在 multi 上运行的准确的亚秒级精确计数器-core and/or 自动超频处理器好吗?
提前致谢。
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
in英特尔家族)。这非常快,并且在现代 CPU 测量时间间隔的方法中非常准确。
我研究了几个主题,试图获得一些关于如何使用 C 或 C++ 制作可靠时钟的想法。然而,我也看到一些函数使用处理器的滴答声和每秒滴答声来计算最终结果,我认为这可能是 CPU 上的一个问题,就像我拥有的那样自动超频。我也看到其中一个过段时间就重置了,所以不是很靠谱。
我们的想法是制作一个(最好是跨平台的)时钟,就像游戏中的时钟一样,精度优于一秒,以便能够在 "current session" 中添加经过的时间程序结束时节省的时间。这将是计算在没有游戏时钟的主机游戏上花费的时间,并且从长远来看 运行 也许将其集成到实际的 PC 游戏中。
它应该能够 运行 而不会占用太多或全部 CPU 的时间(或多核 CPUs 的单核时间),因为它将所有这些资源仅用于时钟以及在具有自动超频的系统上(否则可能导致不准确的结果)使用所有这些资源将是非常糟糕的。
我想在其中实现此功能的程序目前看起来像这样,但我可能会用 C 重新编写它(因为我必须重新学习如何用 C++ 编写代码):
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
cout << "In game" << endl;
system("PAUSE");
return 0;
}
附带说明一下,我仍然需要摆脱 Windows 特定的 PAUSE 功能,但我认为可以通过简单的 "while (char != '\n')" 循环来解决。
我已经浏览过的内容:
- Using clock() to measure execution time
- Calculating elapsed time in a C program in milliseconds
- Time stamp in the C programming language
- Execution time of C program
- C: using clock() to measure time in multi-threaded programs
- Is gettimeofday() guaranteed to be of microsecond resolution?
- How to measure time in milliseconds using ANSI C?
- C++ Cross-Platform High-Resolution Timer
- Timer function to provide time in nano seconds using C++
- How to measure cpu time and wall clock time?
- How can I measure CPU time and wall clock time on both Linux/Windows?
- how to measure time?
- resolution of std::chrono::high_resolution_clock doesn't correspond to measurements
- C++ How to make timer accurate in Linux
- http://gameprogrammingpatterns.com/game-loop.html
- clock() accuracy
- std::chrono doesn't seem to be giving accurate clock resolution/frequency
(编辑:额外研究,特别是对于 C 实现:
- Cross platform C++ High Precision Event Timer implementation(没有真正的答案)
- Calculating Function time in nanoseconds in C code (Windows)
- How to print time difference in accuracy of milliseconds and nanoseconds?(可能是 C 实现的最佳答案)
- How to get duration, as int milli's and float seconds from <chrono>?(又是 C++))
问题是,尚不清楚某些提到的方法(例如 Boost 或 SDL2)是否能正常运行,尤其是在自动超频的情况下。
TL;DR : 我应该使用什么跨平台函数来在 C/C++ 中制作一个可以在 multi 上运行的准确的亚秒级精确计数器-core and/or 自动超频处理器好吗?
提前致谢。
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
in英特尔家族)。这非常快,并且在现代 CPU 测量时间间隔的方法中非常准确。