在窗口中找出精确度为1ms的最快方法是什么?

时间:2010-03-11 15:08:04

标签: c++ windows winapi

对绝对时间感兴趣,而不是衡量持续时间的方法。

Win32 API

C ++

7 个答案:

答案 0 :(得分:5)

你需要特殊的硬件。即使Windows API报告毫秒,但根据此讨论,它并不完全准确:

  

大多数英特尔奔腾基础PC(我不是   确定其他人)有一个计时器芯片   在主板上有一个   1.19318166667MHz计数器。

     

计数器从N开始倒计时(by   默认N = 65535)为1的速率   1.19318166667MHz。当产生系统定时器中断时   计数器从1翻转到N(零   永远不会发生)。注意系统时间是   由此中断更新。

     

如果N = 65535则为系统计时器   中断生成   (1.19318166667 / 65535 * 1000000)= 18.2   每秒一次。这相当于   每54.9毫秒。

     

这种粒度在大多数情况下是固有的   PC正在使用中。

答案 1 :(得分:5)

你需要硬件来达到这种绝对精度,比如GPS Radio clock。您还需要编写设备驱动程序级软件,用户模式程序几乎无法快速响应时间到毫秒级。通常,Windows不是适合此类型的操作系统。

答案 2 :(得分:2)

您需要做的是将时间与偏移计数器的值相关联,并将计算器的频率与您随后在应用程序中的频率一起快速计算绝对时间。

对于没有进行电源管理且使用RDTSC的稳定TSC的单核心主机将是最快的,但您必须自己确定频率,通常是通过运行5秒的固定时间循环和衡量差异。

创建HPET设备是为了克服具有多核,超线程和电源管理的TSC的缺陷,从而导致可变时钟速率。 HPET仅在现代硬件中可用,它们具有自己的计数器和可编程频率,并且必须与TSC类似地读取。成本更高,但约500ns。

Windows提供函数QueryPerformanceCounterQueryPerformanceFrequency来处理这一切,它会自动选择APIC或HPET设备并使用TSC来插值。

答案 3 :(得分:0)

性能计数器中有一些分辨率为1ms的IIRC。

答案 4 :(得分:0)

答案 5 :(得分:0)

如果您想要准确,请查看NIST, National Institute of Standards and Technology。他们拥有允许您从服务器获取时间的软件。它具有高精度和分辨率。这也是GPS接收器使用的时间标准。

但是,由于网络流量和违规行为,您可能无法获得高频率的时间。

答案 6 :(得分:0)

timeGetTime旨在用于媒体播放,因此它比GetTickCount()功能更准确。然而,它没有校准到时钟时间。

将时钟时间精确到毫秒。你必须得到时钟时间,并且timeGetTimeQueryPerformanceCounter尽可能接近同一时间。然后,您可以连续调用timeGetTime等,以获得从已知时钟时间开始经过的毫秒数。

警告timeGetTime每47天换一次......