【发布时间】:2009-03-13 20:28:27
【问题描述】:
我正在使用 QueryPerformanceCounter 来计时一些代码。当代码开始报告明显错误的时间时,我感到震惊。要将 QPC 的结果转换为“实时”时间,您需要除以 QueryPerformanceFrequency 返回的频率,因此经过的时间为:
时间 = (QPC.end - QPC.start)/QPF
重启后,QPF 频率从 2.7 GHz 变为 4.1 GHz。我不认为实际的硬件频率发生了变化,因为运行程序的挂钟时间没有变化,尽管使用 QPC 报告的时间确实发生了变化(下降了 2.7/4.1)。
我的电脑->属性显示:
英特尔(R) 奔腾(R) 4 CPU 2.80 GHz; 4.11GHz; 1.99 GB 内存;物理地址扩展
除此之外,系统似乎工作正常。
我将尝试重新启动以查看问题是否解决,但我担心这些关键性能计数器可能会在没有警告的情况下失效。
更新:
虽然我很欣赏答案,尤其是链接,但我没有受影响的芯片组之一,也没有会自行变化的 CPU 时钟。根据我的阅读,QPC 和 QPF 基于 PCI 总线中的计时器,不受 CPU 时钟变化的影响。在我的情况下,奇怪的是 QPF 报告的 FREQUENCY 更改为不正确的值,并且这个更改的频率也在 MyComputer -> Properties 中报告,我当然没有写。
重新启动解决了我的问题(QPF 现在报告了正确的频率),但我假设如果您计划使用 QPC/QPF,您应该在信任它之前针对另一个计时器对其进行验证。
【问题讨论】:
-
QPC 和 QPF 是出了名的不可靠,MSDN 文档故意误导(MS 声称如果值错误,那是 BIOS 制造商的错,同时仍然声称事情是可靠的......但是我敢肯定,如果因此出现问题,用户会责怪你,而不是 BIOS 制造商)
标签: timer