【问题标题】:High resolution timers vs low resolution timers高分辨率计时器与低分辨率计时器
【发布时间】:2013-06-21 21:23:49
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ windows timer


    【解决方案1】:

    通常,低分辨率计时器会每隔 x 时间(例如,每 1、5、10、16.6667、17.81291 或 20 毫秒 - 例如,它可能有许多其他值)向处理器触发一次中断。当任务运行“太长时间”以及维护当前时间、“超时”等待事件以及诸如此类的事情(例如,sleep 类型的函数调用将自己设置为“超时”在睡眠时间结束时)。

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

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

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

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

    【讨论】:

    • 我有点困惑,那么制作一个低分辨率计时器是否仍然可以接受,然后当该计时器完成时启动一个高分辨率计时器来设置一个事件,比如说,距离正好 10.761 秒当低分辨率定时器启动时,让低分辨率定时器在 10 处结束,从而启动 0.761 的高分辨率定时器?
    • 请注意,您不能“等待”高分辨率计时器(如果我们谈论的是硬件计时器)。换句话说,您需要一个循环来执行 while(hr_timer() > x) /* do nothing */ ;
    • 我想弄清楚的是如何实现具有与低分辨率计时器相当的高精度和 cpu 使用率的计时器,是可以完成的事情还是我总是需要权衡精度还是cpu资源更重要?另外我仍然不明白为什么我不能等待高分辨率计时器,如果我尝试这样做会导致我的想法失败会发生什么?
    • 这真的取决于硬件到底是什么。但在大多数情况下,高分辨率计时器不提供中断,这是操作系统需要能够“休眠到此时”[我所说的休眠是指“让这个任务进入休眠状态,让其他东西运行,或者如果没有可用的东西就闲着]。
    • 当然,另一点是你可以通过发出大量非常短的睡眠轻松“杀死”操作系统 - 它只会设置睡眠,在很短的时间内唤醒另一个任务时间,然后切换回刚刚醒来的你。没有人会完成任何工作。所以操作系统真的不喜欢实现极短的定时器功能。 [再一次,如果操作系统决定运行其他东西,你的计时精度肯定会丢失]。
    猜你喜欢
    • 2011-04-02
    • 2011-10-31
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多