如何实现
QueryPerformanceCounter
?
QPC计时器在HAL中的实现取决于硬件,它使用TSC、HPET、RTC、APIC、ACPI或8254定时器,具体取决于可用性。
QPC计时器的分辨率硬编码为100纳秒。但这并不重要,因为调用QPC本身需要大于100纳秒的时间。在Windows世界中,100纳秒只是非常非常短的时间。
RDTSC
的分辨率优于1ns,但随着频率而变化。
实际上,自Nehalem以来TSC频率非常稳定。请参阅Intel 64架构SDM第3A卷,“17.16不变TSC”:
处理器系列以不同的方式增加时间戳计数器:
对于Pentium M处理器(系列[06H],型号[09H、0DH]);对于Pentium 4处理器、Intel Xeon处理器(系列[0FH],型号[00H、01H或02H]);以及对于P6处理器系列:时间戳计数器会随着每个内部处理器时钟周期增加。内部处理器时钟周期由当前内核时钟到总线时钟比率确定。Intel SpeedStep技术转换也可能影响处理器时钟。
对于Intel Xeon处理器(系列[0FH],型号[03H及更高型号]);对于Intel Core Solo和Intel Core Duo处理器(系列[06H],型号[0EH]);对于Intel Xeon处理器5100系列和Intel Core 2 Duo处理器(系列[06H],型号[0FH]); 对于Intel Core 2和Intel Xeon处理器(系列[06H],DisplayModel [17H]);对于Intel Atom处理器(系列[06H],DisplayModel [1CH]):时间戳计数器以恒定速率递增。该速率可能由处理器的最大核心时钟比总线时钟比设置,也可能由处理器引导时设置的最大可解决频率设置。最大可解决频率可能与处理器基础频率不同,请参阅第18.18.2节了解更多详细信息。在某些处理器上,TSC频率可能与品牌字符串中的频率不同。
较新处理器中的时间戳计数器可能支持一种增强功能,称为不变TSC。处理器对不变TSC的支持由指示。不变TSC将在所有ACPI P、C和T状态下以恒定速率运行。这是未来的体系结构行为。对于支持不变TSC的处理器,操作系统可以使用TSC进行墙上时钟计时器服务(而不是ACPI或HPET计时器)。TSC读取效率更高,不会带来环路转换或访问平台资源的开销。
因此,如果需要快速测量,您应该能够使用__rdtsc
或__rdtscp
。您可以在启动时校准TSC频率,并确保它不依赖于CPU状态。但线程仍然可能会被抢占,因此最好多次重复测量或使用QueryThreadCycleTime
(当然,这也带有自己的开销)。在实际应用中,我发现RDTSC
并没有像在使用RDTSC计算系统时间中所述那样糟糕,尽管后者仍然是一个不错的阅读资料。
RDTSC
时,平均化可能有所帮助,但如果频率不是随机变化的(由于热限制),这将无济于事。QueryPerformanceCounter
的平均化不会有太大帮助,因为最短的事件约为100纳秒。它是应该在通用硬件上运行的软件分析器,因此硬件时间也不是一个选择。 - mvorisek