使用HPET时QueryPerformanceFrequency是否准确
Is QueryPerformanceFrequency accurate when using HPET?
我在玩QueryPerformanceFrequency
。它曾经返回3.6 Mhz
,但这还不足以满足我的要求
我已使用此命令bcdedit /set useplatformclock true
启用了HPET
。现在它返回14.3 Mhz
。它很棒,更精确。。。当然不是。我很快意识到我没有得到我期望的粒度。
如果我尝试轮询QueryPerformanceCounter
直到它滴答作响,我能得到的最小增量是11
,也就是1.27Mhz
。如果我试着计算一秒钟内可以从QueryPerformanceCounter
得到的不同值的数量,我得到的是1.26Mhz
。
所以我想知道有没有办法真正充分利用14.3 Mhz
?
我使用的是windows7,64位系统,visualstudio2008。
众所周知,使用HPET硬件作为QueryPerformanceCounter(QPC)的来源会带来巨大的开销。
QPC在配置HPET时是一个昂贵的调用
它提供14.3 MHz,这表明它的精度很高,但正如你所发现的,它的调用速度还不够快,无法真正解析该频率。
因此,只要硬件有能力,微软就把CPU时间戳计数器(TSC)作为QPC的来源。TSC查询的开销要低得多。用于QPC的相关频率通常是CPU频率除以1024;通常也是几个MHz。
TSC模式下QPC的呼叫速度如此之快,以至于许多连续呼叫可能会显示相同的结果(通常约20-30次呼叫或15-20ns/次呼叫)。通过这种方式,您可以获得大约0.3 us的典型分辨率(在3.4 GHz CPU上)。
在切换到HPET之前,您观察到3.6 MHz。这可能是系统ACPI PM定时器(3579545 Hz)的签名,这表明在切换到HPET之前,您没有在基于TSC的QPC上操作。
因此,无论哪种方式,运行HPET或ACPI PM定时器都会在几个MHz的范围内产生可用的分辨率。两者都无法暴露性能计数器频率(PCF)给出的全部分辨率,因为对QPC的调用过于昂贵。只有基于TSC的QPC足够快并且能够实际对QPC进行过采样。
微软最近刚刚发布了关于此事的更详细信息:
有关详细信息,请参阅获取高分辨率时间戳(MSDN 2014)。
这是一篇综合性的文章,有很多例子和详细的描述。QPC用户的必读。
。。。一种真正充分利用14.3兆赫的方法
很遗憾没有
您可以从Windows系统内部运行Coreinfo.exe
实用程序。系统内部已经转移到微软技术网。这是链接:Sysinternals系统信息实用程序。这将为您提供问题的答案:如何检查我的系统是否具有非不变TSC
摘要:QPC基于TSC获得最佳分辨率/准确度/粒度。
BTW:正确选择硬件作为QPC的资源也会影响新的GetSystemTimePreciseAsFileTime函数(Windows 8桌面及以上)的调用费用,因为它在内部使用QPC。
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 无论条件是否为true,if总是在c++中执行
- 如何找到大小'x'数组是否完全填充,在C++?
- 检查值是否在集合p1和p2中,但不在p3中
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- C/C++预处理器是否可以检测一些编译器选项
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话