什么是窗口高性能计数器的分辨率
What is the resolution of windows high performance counter?
似乎是一个非常基本的问题,但是,当划分输出时
QueryPerformanceCounter
QueryPerformanceFrequency
,结果值是多少,即秒、毫秒、微秒?
我问是因为我要把一些代码从Windows移植到Linux,而且我没有方便的Windows机器来试验。 一些谷歌搜索没有为我提供具体的答案。
我们已经更新了 QueryPerformanceCounter 的文档,上面 RDTSC 和 QueryPerformanceCounter 准确性之间的比较不太正确。 欲了解更多信息,请参阅
http://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx
埃德·布里格斯Microsoft公司
一些谷歌搜索没有为我提供具体的答案。
第一个 Google 搜索结果 "QueryPerformanceCounter":MSDN 文档QueryPerformanceCounter()
以下是它要说的:
参数
lpPerformanceCount [out]
类型: LARGE_INTEGER*
指向接收 当前性能计数器值(以计数为单位)。
第一个 Google 搜索结果 "QueryPerformanceFrequency":QueryPerformanceFrequency()
的 MSDN 文档
以下是它要说的:
参数
lp频率 [输出]
类型: LARGE_INTEGER*
指向变量的指针 接收当前性能计数器频率(以计数为单位) 第二。如果安装的硬件不支持高分辨率 性能计数器,此参数可以为零。
从QueryPerformanceCounter()
获得的值以计数为单位。从QueryPerformanceFrequency()
获得的值以每秒计数为单位。使用一些维度分析:
(counts) / (counts/second) = seconds
因此,将这两个值相除的结果以秒为单位。
我所知,QPF通常依赖于两个来源之一。至少在一次,大多数单处理器系统使用处理器的时间戳计数器寄存器,通过RDTSC指令访问。
多处理器系统(以及没有 TSC 寄存器的旧系统)通常使用主板的板载 1.024 MHz 时钟。在多处理器/多核系统上,处理器/内核的时间戳计数器可能不同步,因此时间戳计数器可能会给出相当无意义的结果(包括负时间段)。
尽管 In Silico 回答了这个问题,但如果您正在寻找更高的计时器分辨率,您可以使用 rdtsc
汇编指令。 rdtsc
比 QueryPerformanceCounter
和QueryPerformanceFrequency
精确约 1000 倍,因为它使用 CPU 时钟(而不是主板时钟)。该方法如下所示:
void QueryRDTSC(__int64* tick) {
__asm {
xor eax, eax
cpuid
rdtsc
mov edi, dword ptr tick
mov dword ptr [edi], eax
mov dword ptr [edi+4], edx
}
}
有趣的事实:由于较大的石英晶体,较慢的主板时钟也更容易受到时钟漂移的影响。当然,您是否想深入研究高分辨率时序的深度,完全取决于时序在您的应用中的重要性。祝您编码愉快!
7引入了一种为QueryPerformanceCounter
生成结果的新方法。
假设此函数具有尽可能精细的粒度,但必须查看其准确性:QueryPerformanceFrequency
返回的值既不完全是观察到的值,也不是常数。特别是较旧的系统会遭受严重的热漂移。
我在这里写了一些更多细节。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 查询性能计数器限制/加快幻灯片速度
- 在Windows上读取性能数据计数器是否需要任何特殊的安全权限
- 如何以编程方式访问c/c++a-la-rdtsc中的性能计数器
- PDH性能计数器实例名称
- 什么是窗口高性能计数器的分辨率
- 查询性能计数器函数在在线判断中的使用
- 性能计数器C++的窗口时序漂移
- 错误的计数器路径,pdhAddCounter;窗口中的性能监视器
- C中ubuntu上的性能计数器库
- 不带lodctr的c++中的性能计数器
- 是否可以使用查询性能计数器(Win32,C)获取时间戳
- 从C++公开的 Windows 性能计数器始终在 perfmon 中产生"Can't load counters".exe
- Visual c++中的函数性能计数器
- 需要对"High definition time-stamps"进行一些澄清(win32,direct3d,性能计数器)
- 在Linux下使用硬件性能计数器
- 卤化物的性能计数器
- 使用性能计数器获取正常运行时间的权限问题
- 如何在C++中读取性能计数器
- 以与语言无关的方式检索性能计数器值