Windows精确计时:CreateTimerQueueTimer或system_clock::now()错误
Windows Precise Timing : Error in CreateTimerQueueTimer or system_clock::now()?
我正在努力实现+/- ms定时精度。我希望线程之间的时间是10ms,但是当我测量时间时,我得到的东西更接近15ms。
我正在试图理解问题是由于我测量时间的方式,还是由于我准确地测量时间,并且CreateTimerQueueTimer
引入了一些延迟
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <chrono>
#include <ctime>
using namespace std;
int current;
long long* toFill;
void talk()
{
chrono::time_point<chrono::system_clock> tp =
chrono::system_clock::now();
toFill[current++]=chrono::duration_cast<chrono::milliseconds>(tp.time_since_epoch()).count() ;
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hTimer;
current = 0;
toFill = new long long[1000];
CreateTimerQueueTimer(&hTimer,NULL,
(WAITORTIMERCALLBACK)talk,NULL,
0,10,0);
_sleep(3000);
DeleteTimerQueueTimer(NULL,hTimer,NULL);
for (int i = 1;i<current;i++)
{
cout << i << " : " << toFill[i]-toFill[i-1]<< endl;
}
return 0;
}
输出看起来像
...
161 : 16 <-- Should be 10
162 : 15
163 : 16
164 : 16
...
Windows中的计时器和实时时钟的准确性受到时钟滴答中断率的限制。默认情况下每秒运行64次,1/64秒= 15.625毫秒。就像你看到的。
增加这个速率实际上是可能的,在程序开始时调用timeBeginPeriod(10)以获得10毫秒的精度。
CreateTimerQueue不是用于精确计时的。它在底层使用线程池,这可能会导致严重的延迟。
来自MSDN的CreateTimerQueueTimer函数文档:
回调函数在线程池中排队。这些线程受到调度延迟的影响,因此时间可以根据应用程序或系统中发生的其他事情而变化。
如果你需要比15毫秒更好的分辨率,那么这将有希望帮助:
为Windows实现持续更新,高分辨率的时间提供程序
(感谢@MaxTruxa对链接的更新)
至于测量时间:如果我可以访问Windows或Visual Studio,我会给high_resolution_clock一个机会。(我7年前切换到Linux,抱歉,我不能自己检查)正如Xeo所写:"high_resolution_clock是MSVC的system_clock的类型定义。"
相关文章:
- 使用 SendInput 或 mouse_event 不适用于 clock()?
- 如何以毫秒为单位获取开始时间和 now() 之间的毫秒差异(以 C++为单位?
- 是否确保 2 个连续的 std::chrono::steady_clock::now() 不相等?
- python equivalent of std::chrono::steady_clock::now();
- 为什么我们可以在 c++ 中使用 srand(clock())?
- 如何找到纪元时间戳和 std::chrono::system_clock::now 之间的时差(以毫秒为单位)
- 除了使用 clock() 函数之外,有没有更好的方法来以给定的频率生成/发布数据
- IBM AIX std::clock()?
- 为什么常量CLOCKS_PER_SEC不需要用 std:: 命名,但 <ctime> clock() 和 clock_t 可以呢?
- 当我使用 cin 时,我如何使用 clock() 测量时间
- 两个结果的std :: chrono :: high_resolution_clock :: now()给出了〜270n
- 我可以使用 now() 将wait_until转换为wait_for吗?
- 'clock()' 给出通常的时钟而不是 CPU 时钟
- "std::chrono::system_clock::now().time_since_epoch()&qu
- 使用Clock()函数测量程序的运行时间
- 为什么我的sf :: clock在sfml中单独重置
- C++:Linux 中的计时(使用 clock())不同步(由于 OpenMP?)
- 如何在C (例如System.DateTime.NOW In .net中)中格式化当前的DateTime
- 如何在Linux上获得C 代码块的时钟刻度?clock()结果没有意义
- 使用Chrono :: High_resolution_clock :: NOW()使用奇数行为