5

我需要在很长一段时间(几个小时)内每隔几毫秒(20、30、40 毫秒)获取准确的时间戳。获取时间戳的函数作为回调被第 3 方库调用。

使用GetSystemTime()一个可以获得正确的系统时间戳,但只有毫秒精度,这对我来说不够精确。使用QueryPerformanceTimer()会产生更准确的时间戳,但在很长一段时间内不会与系统时间戳同步(请参阅http://msdn.microsoft.com/en-us/magazine/cc163996.aspx)。

上面链接的站点上提供的解决方案以某种方式仅适用于较旧的计算机,当我尝试将其与较新的计算机一起使用时,它会在同步时挂起。

在我看来,boost 也只适用于毫秒精度。如果可能的话,我想避免使用外部库,但如果没有其他选择,我会选择它。

有什么建议么?

谢谢你。

4

4 回答 4

4

从 CodeProject 中删除的文章,这似乎是副本:DateTimePrecise C# Class这个想法是使用QueryPerformanceCounterAPI 进行精确的小增量并定期调整它以保持长期准确性。这将提供微秒精度(“大约”,因为它仍然不完全精确,但仍然相当可用)。

另请参阅:Windows 上的微秒分辨率时间戳

于 2011-09-28T12:23:53.403 回答
0

您使用哪种语言?

  • 在 Java(1.5 或更高版本)中,我建议使用不需要导入的“System.nanoTime()”。

请记住,在 Windows 中,时间片粒度为 1000ms / 64 = 15.625ms。

  • 这将影响进程间通信,尤其是在单处理器机器上,或“同时”运行多个 CPU 使用率高的进程的机器上*。

  • 事实上,我刚刚通过 eBay 获得了 DOS 6.22 和 Windows for Workgroups 3.11/3.15,所以我可以截取我刚开始接触它的那个时代单处理器 Windows 机器的原始时间片配置。(尽管它在 3.0 以上的版本中可能不可见)。

于 2011-09-28T12:22:27.547 回答
0

您将很难在 Windows 上找到比 QueryPerformanceTimer() 更好的东西。

在现代硬件上,它使用 HPET 作为替代 RTC 中断控制器的源。我希望 QueryPerformanceTimer() 和系统时钟是同步的。

于 2011-09-28T13:22:23.093 回答
0

Windows 上没有这样的 QueryPerformanceTimer()。该资源名为QueryPerformanceCounter(). 它提供了一个以更高频率计数的计数器值。可以通过调用来检索其递增频率QueryPerformanceFrequency()。由于该频率通常在 MHz 范围内,因此可以观察到微秒级分辨率。

有一些实现,即这个线程或在Windows Timestamp Project

于 2012-07-12T13:11:16.633 回答