我在不同的操作系统上运行一些计时代码。对于QueryPerformanceCounter的结果,我注意到了以下模式
标准Windows XP使用处理器频率,这意味着它在幕后使用RDTSC。
Vista使用HPET,14,318,180 Hz
任何装有/usepmtimer的Windows版本都使用ACPI时钟,3,579,545 Hz
Windows7使用来源不明的时钟,返回的数字在2.4到2.6 MHz之间变化。
有人知道Windows7默认使用的时钟是什么吗?为什么它比ACPI时钟还要慢?有没有办法强制Windows7使用HPET?
发布于 2011-05-05 05:09:14
Windows7将根据可用的处理器/硬件在启动时选择不同的QPC源-我相信SP1在这方面也有变化。
Vista的改变很可能是出于AppCompat的原因,因为在读取RDTSC的多核CPU上,它们不能保证是同步的,所以在多个CPU上调度的应用程序有时会看到QPC出现倒退,并会崩溃。
发布于 2012-02-29 10:54:09
好的,这只是一个部分的答案,因为我还在弄清楚,但是这个2.x MHz频率等于标称的TSC速度除以1024。
试着用你的QPF结果和你自己的CPU速度来计算一下,结果应该是正确的。
我最初认为这是HPET比率的一部分,但似乎不是这样的。
现在的问题是: LAPIC定时器以系统总线速率运行,但TSC也是如此(在应用mult系数之前),所以我们不知道在最终除法之前使用了什么计数器(它可能是TSC/1024或总线/其他什么),但我们知道它使用的是主板晶体(驱动总线的那个)。
听起来不太对劲的是,一些MSDN文章似乎暗示LAPIC timer几乎没有被使用(虚拟机管理程序/虚拟机除外),但鉴于HPET由于许多实现问题而未能实现其承诺的事实,以及大多数新平台具有不变的TSC的事实,它们再次改变了方向。
不过,我没有从微软那里找到任何关于Win7中使用的新源代码的正式证据……我们不能完全控制HPET,因为即使不在计时器模式下使用,它的计数器仍然可以被读取(例如:通过QPF),但是为什么要除以它的速率,从而降低它的分辨率呢?
https://stackoverflow.com/questions/5887628
复制相似问题