Windows7之前的计时器合并

Windows7之前的计时器合并,windows,winapi,timer,coalescing,Windows,Winapi,Timer,Coalescing,Windows 7和Windows 8中提供计时器合并支持,请参见以下示例: Windows7有一个功能,据称它支持合并和合并。 Windows8还有一个支持根据MSDN合并的功能 关于Windows 7和Windows 8中的计时器合并的讨论很多。但看起来它可能已经提前实施了。是这样吗 首先,在Vista下提供计时器合并是否正确。或者它仅仅提供了接口,并且实际上只在Windows7之后才实现合并? 从这本书上我可以读到 “这实际上是一种影响能效并有助于降低总体功耗的功能。它基于一种称为定时器合

Windows 7和Windows 8中提供计时器合并支持,请参见以下示例:
Windows7有一个功能,据称它支持合并和合并。
Windows8还有一个支持根据MSDN合并的功能


关于Windows 7和Windows 8中的计时器合并的讨论很多。但看起来它可能已经提前实施了。是这样吗


首先,在Vista下提供计时器合并是否正确。或者它仅仅提供了接口,并且实际上只在Windows7之后才实现合并?
从这本书上我可以读到

“这实际上是一种影响能效并有助于降低总体功耗的功能。它基于一种称为定时器合并的技术。”

对于所有支持
SetThreadpoolTimer
功能的Windows版本,这句话是否正确


其次,现在我开始思考。我可以看到它的参数名为
uResolution
。在计时器事件等待期间,此参数是否会像更改全局计时器分辨率一样更改全局计时器分辨率,还是仅影响此特定计时器,同时提供计时器合并



最后,在Windows XP或Vista下是否有提供计时器合并功能的附加或替代功能?

一般来说:

计时器合并提供了一种减少中断次数的方法。允许应用程序为其计时要求指定公差。这允许操作系统“批量”中断,并产生以下几种后果:

  • 中断的次数可以减少。(+)
  • 上下文开关的数量可能更少。(+)
  • 可以降低功耗。(+)
  • 大量操作可能必须在这些批处理中断(-)中完成
  • 计划程序此时可能必须计划大量进程(-)
  • 时间分辨率更差(-)
Windows以及其他基于中断的操作系统总是“批处理”定时事件。任何设置为在特定时间发生的事件都依赖于一个到期时间,该到期时间将随着中断而过期。因此,事件与中断合并。该方案的粒度由中断频率决定。对计时器合并感兴趣的人必须阅读:

出于性能原因,应尽一切努力减少中断的数量 尽可能多。不幸的是,许多软件包确实将系统计时器分辨率设置得非常高,例如通过多媒体计时器接口
timeBeginPeriod
/
timeEndPeriod
或底层API
NtSetTimerResolution
。正如Hans提到的:“Chrome”是一个很好的例子,说明了这些功能的使用可能被严重夸大


其次,现在我开始想
timeSetEvent
是多媒体定时器功能之一。它在发动机罩下使用
timeBeginPeriod

而且它使用得很糟糕:它将系统计时器分辨率设置为在执行平台上可用的计时器分辨率范围内尽可能好地匹配uResolution。在uDelay的较大值上,它可以在低分辨率下等待,直到接近延迟到期,然后才提高系统计时器分辨率,但它会将整个等待期间的计时器分辨率设置为指定的分辨率。这是痛苦的,因为知道高分辨率也适用于长时间的延迟。但是,不建议在大延迟时使用多媒体定时器功能。但是反复设置分辨率也不好(参见下面的注释)

关于
timeSetEvent
的总结:这个函数根本没有做任何类似于合并的事情,它做的恰恰相反:它可以选择性地增加中断的数量;从这个意义上讲,它将事件传播到更多的中断上,并“分批”它们

SetThreadpoolTimer
首次引入了“批处理”事件的思想。这主要是由于对Windows笔记本电脑电池寿命的投诉不断增加
SetWaitableTimerEx
进一步推动了该策略,而
SetCoalescableTimer
是访问聚合计时器的最新API。后者引入了TIMERV_DEFAULT_合并和TIMERV_NO_合并,这是值得考虑的,因为它们允许忽略某些事实


借此机会了解有关系统计时器分辨率的一些说明:

更改系统计时器分辨率的后果不仅仅是增加中断频率。使用
timeBeginPeriod
/
NtSetTimerResolution
会产生一些影响:

  • 中断频率变化
  • 线程数量更改(线程时间片)(!)
  • 系统时间的中断()
  • 系统时间调整激活时会打嗝(
    SetSystemTimeAdjustment
  • 第3点。Windows 7和Point 4部分解决了这一问题。仅在Window 8.1中提供了地址。 系统时间的中断可能与支持的最小计时器分辨率(典型系统上为15.625 ms)一样大,并且在
    timeBeginPeriod
    /
    NtSetTimerResolution
    频繁时累积。当试图调整系统时间以匹配NTP参考时,这可能会导致相当大的跳跃。在Windows版本 最后:只要Windows认为这样做有好处,它就会更改系统计时器分辨率。支持的计时器分辨率数量取决于底层硬件和Windows版本。可用分辨率列表可以通过调用
    timeBeginPeriod
    进行扫描来获得,增加周期后再调用。吃点东西