定时器精度:c Clock( ) 与 WinAPI 的 QPC 或 timeGetTime( )

2023-12-26

我想表征软件计时器的准确性。我不太关心它的准确性,但确实需要知道准确性是多少。

我研究了c函数clock(),以及WinAPI的函数QPC和timeGetTime,我知道它们都依赖于硬件。

我正在测量一个可能需要大约 5-10 秒的过程,我的要求很简单:我只需要 0.1 秒的精度(分辨率)。但我确实需要知道最坏情况下的准确性是多少。

虽然更高的准确度是首选,但我宁愿知道准确度很差(500 毫秒)并解释它,也不愿相信准确度更好(1 毫秒)但无法记录它。

有人对如何表征软件时钟精度有建议吗?

Thanks


您需要区分准确性、分辨率和延迟。

Clock()、GetTickCount 和 timeGetTime() 源自校准的硬件时钟。分辨率不是很好,它们由时钟滴答中断驱动,默认情况下每秒滴答 64 次或每 15.625 毫秒一次。您可以使用 timeBeginPeriod() 将其降低到 1.0 毫秒。精度非常好,时钟是通过 NTP 服务器校准的,您通常可以相信它一个月内的偏差不会超过一秒。

QPC 具有更高的分辨率,总是优于一微秒,在某些机器上低至半纳秒。然而它的精度较差,时钟源是从芯片组某处拾取的频率。它未经校准,具有典型的电子公差。仅将其用于计时短间隔。

当您处理计时时,延迟是最重要的因素。如果您读取速度不够快,那么高精度的计时源就没有任何用处。当您在保护模式操作系统上以用户模式运行代码时,这始终是一个问题。其中的代码始终比您的代码以更高的优先级运行。特别是设备驱动程序,尤其是视频和音频驱动程序,是麻烦制造者。您的代码也会被从 RAM 中换出,需要出现页面错误才能加载回来。在负载较重的机器上,数百毫秒内无法运行代码并不罕见。您需要将这种故障模式考虑到您的设计中。如果您需要保证亚毫秒级的精度,那么只有具有实时优先级的内核线程才能满足您的要求。

一个相当不错的计时器是从 timeSetEvent() 获得的多媒体计时器。它旨在为需要可靠计时器的程序提供良好的服务。您可以将其设置为 1 毫秒,它会尽可能赶上延迟。请注意,它是一个异步计时器,回调是在单独的工作线程上进行的,因此您必须小心注意正确的线程同步。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

定时器精度:c Clock( ) 与 WinAPI 的 QPC 或 timeGetTime( ) 的相关文章

随机推荐