c++ - 高分辨率定时器与低分辨率定时器

标签 c++ windows timer

我最近在阅读有关高分辨率和低分辨率计时器的内容,但不太明白。他们如何运作?它们不都是通过检查计算机硬件上的内部系统时钟来操作的吗?如果是这种情况,是否意味着分辨率越高,检查的频率就越高,消耗的资源就越多?

我使用低分辨率计时器有什么问题吗?当计时器到期时,在高分辨率计时器应该停止的一秒(或更早)内启动高分辨率计时器?或者这会因为某种原因不起作用?

与低分辨率计时器相比,高分辨率计时器大约消耗多少资源?

最佳答案

通常,低分辨率计时器会每隔 x 时间(例如,每 1、5、10、16.6667、17.81291 或 20ms - 例如,还有许多其他值)向处理器触发一个中断。当任务运行“太长时间”时,操作系统使用它来切换任务,以及维护当前时间、“超时”等待事件等(例如 sleep 类型函数)调用将在 sleep 时间结束时将其自身设置为“超时”)。

高分辨率定时器通常是一个硬件寄存器,它以高 KHz 或更高的频率(例如 32768Hz、36KHz、12MHz、2.2GHz)持续计数[向上或向下]/更新 - 这些只是一些示例,几乎可以是任何东西)。通常,这通过“读取当前值”来使用,并且您可以获得当前计数。

这将提供高分辨率计时值,这对于测量短间隔很有用(例如,用于基准测试或计算出其他服务器响应 ping 所需的时间,或其他一些少量的时间),但您可以使用高分辨率计时器并不能真正“等待 600 毫秒” - 至少不能不读取所述计时器无数次,因为您不能(在我在这里描述的典型情况下)说“告诉操作系统再次启动此任务在 X 次计数中”。

(但是,有时高分辨率计时器与低分辨率计时器只是相同的硬件,只是以不同的方式使用 - 无论是一个还是多个提供不同类型计时的单元,我上面描述的差异仍然相关) .

还请记住,如果您想要“精确计时”,操作系统需要很好地配合。大多数现代操作系统“不喜欢”那些只是坐在那里消耗 CPU 时间的任务(例如“我们到了吗”类型的计时器轮询),因此会优先考虑其他运行时间短的任务。这意味着,如果您有高精度计时要求,操作系统需要为您提供帮助,而不是在您的任务到达正确的时间步时停止运行。在不确切知道您要做什么的情况下,很难确定您的情况下正确的解决方案是什么。

关于c++ - 高分辨率定时器与低分辨率定时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17236039/

相关文章:

windows - 使用 npm 安装 postgres 问题

c++ - CWA(dll,api) - C++ 宏?

windows - 在 silverlight 和 WinRT 应用程序之间共享代码

javascript - setinterval 右键单击​​时停止

android - 使用 NDK,std::fstream open() 失败,而 fopen() 正常工作,为什么?

字符串匹配alg的c++实现

.net - 为什么 .NET 计时器的分辨率限制为 15 毫秒?

delphi - 在 Delphi 中编程延迟的最佳方法是什么?

c++ - 为什么vector前面没有push/pop?

c++ - 为 unordered_map 定义自定义哈希函数和相等函数