求助高手QueryPerformanceFrequency为什么精确

西笑生
人工智能领域优质创作者
2012-05-05 03:22:39
求助高手QueryPerformanceFrequency为什么精确,需要原理
...全文
3039 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
emailtome 2014-01-12
  • 打赏
  • 举报
回复
http://software.intel.com/zh-cn/articles/code-section 该增强的计时器(Etimer)是基于两个 Windows* API 函数,而这两个 API 函数分别是:QueryPerformanceCounter 和 QueryPerformanceFrequency。我们并不清楚微软使用什么频率在给定平台上执行这两个函数。但有一点可以肯定,计时器的频率在计时过程中绝不会发生变化。计时器可能会是芯片组计时器,也可能是电源管理计时器,或其它计时器。Etimer 的创建是为了实现两个目标:首先,它可以作为一种精确度达到纳秒级的高精度计时器,其次,它不受英特尔 SpeedStep® 动态节能技术、增强型英特尔 SpeedStep® 动态节能技术或其它类似技术的限制。操作系统将进行检查,看看系统是否内置了高性能的时钟,如果有的话,系统就没有英特尔 SpeedStep® 动态节能技术此类的能耗节省机制,那么计时器就可以充分利用该时钟的优势,这与处理器时钟最为相似。否则的话,计时器就将使用其它频率一致的时钟,如芯片组、基本输入与输出系统(BIOS)或电源管理计时器。当在您的应用中使用此种时钟时,还有一些因素需要考虑。由于 Etimer 使用系统调用 QueryPerformanceCounter 和 QueryPerformanceFrequency,因此将产生与系统调用相关的开销(overhead)。Etimer 的检查机制也会占用相关的资源,以确保所有的测量均是在相同的处理器上进行的。如果系统开销(overhead)对于您的应用来说过多,您可以通过调用指令 RDTSC,来使用处理器时钟。下面我们就可以使用RDTSC的情形进行探讨。通常在多处理器系统中,Windows 会将时间戳计数器(TSC’s)在所有的处理器上保持同步。TSC 值并不完全相同,但它们之间相差很小。当函数 QueryPerformanceFrequency 的返回值与处理器时钟的相同时,Windows 就将 TSC 保持同步。在这种情况下,您可以安全地使用 TSC,而且不用担心他们来自哪个处理器。因此,您就可以消除所有与该机制相关的系统开销(overhead),该机制会迫使所有的测量在相同的处理器上进行。
worldy 2013-12-09
  • 打赏
  • 举报
回复
Return Values If the installed hardware supports a high-resolution performance counter, the return value is nonzero. If the installed hardware does not support a high-resolution performance counter, the return value is zero.
worldy 2013-12-09
  • 打赏
  • 举报
回复
QueryPerformanceFrequency 从硬件的实时计算器获取主频频率 QueryPerformanceCounte 从硬件的实时计算器中获取当前计数值,实时计算器由硬件驱动和进程线程无关
sichuanwww 2013-12-09
  • 打赏
  • 举报
回复
baoyz 2012-06-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
引用 8 楼 的回复:

引用 5 楼 的回复:

你一直纠结的“为什么”是什么呢
我已经说了这里的精度可以达到晶振的级别
这个是地球上计时最准的
我们现在用的时间
国家授时台给的时间都是根据他们自己的晶振计算出来的
也就是所谓的原子钟

由于该函数微软没有提供源码,这里的为什么只得是想推测出代码级的原理。因为AMD“Cool N' Quiet或者其他的技术 曾经都对该函数产……

……
原来你是这个意思
误差这个东西是无法避免的
如果需求对时间精度要求极高那最好还是自己做硬件定时器
[/Quote]
即使你自己做了硬件定时器,一样的有误差。误差是绝对的,精确是相对的。
向立天 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 5 楼 的回复:

你一直纠结的“为什么”是什么呢
我已经说了这里的精度可以达到晶振的级别
这个是地球上计时最准的
我们现在用的时间
国家授时台给的时间都是根据他们自己的晶振计算出来的
也就是所谓的原子钟

由于该函数微软没有提供源码,这里的为什么只得是想推测出代码级的原理。因为AMD“Cool N' Quiet或者其他的技术 曾经都对该函数产生过影响,需要下载补丁才可……
[/Quote]
原来你是这个意思
误差这个东西是无法避免的
如果需求对时间精度要求极高那最好还是自己做硬件定时器
Lactoferrin 2012-05-07
  • 打赏
  • 举报
回复
这函数不复杂,反汇编一下即知
最终会到hal.dll的KeQueryPerformanceCounter,所以直接从这里看
西笑生 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

你一直纠结的“为什么”是什么呢
我已经说了这里的精度可以达到晶振的级别
这个是地球上计时最准的
我们现在用的时间
国家授时台给的时间都是根据他们自己的晶振计算出来的
也就是所谓的原子钟
[/Quote]
由于该函数微软没有提供源码,这里的为什么只得是想推测出代码级的原理。因为AMD“Cool N' Quiet或者其他的技术 曾经都对该函数产生过影响,需要下载补丁才可修复。
wocow3 2012-05-06
  • 打赏
  • 举报
回复
查询CPU内的计数器,结合主频就可以推断时间。
但是这个函数本身调用会带来模式切换的开销,计量小的时间间隔时得考虑修正
Lactoferrin 2012-05-06
  • 打赏
  • 举报
回复
QueryPerformanceCounter会根据情况选用一个合适的计数器,例如某些时候它用的就是rdtsc指令
tsc的频率比Sleep,WaitFor..这样的api所依赖的时钟中断高得多
向立天 2012-05-05
  • 打赏
  • 举报
回复
你一直纠结的“为什么”是什么呢
我已经说了这里的精度可以达到晶振的级别
这个是地球上计时最准的
我们现在用的时间
国家授时台给的时间都是根据他们自己的晶振计算出来的
也就是所谓的原子钟
西笑生 2012-05-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

QueryPerformanceCounter是查询定时器的计数值,如果硬件里有定时器,它就会启动这个定时器,并且不断获取定时器的值,这样的定时器精度,就跟硬件时钟的晶振一样精确的,这就是原理
[/Quote]
你好,我看了下面的文档
bug:
http://msdn.microsoft.com/en-us/library/ee417693(v=vs.85).aspx

说明:
http://support.microsoft.com/kb/895980/zh-cn

我的总结是
屏蔽底层硬件差异(有无支持HRT的硬件high resolution timer),为用户提供计时功能。 如果底层硬件支持HRT,两个API就会返回高精度

的时间计数(微妙或纳秒级), 如果底层硬件不支持, 两个API的调用结果就类似于 GetTickCount () API返回给用户的时间精度(毫秒级

)。
计时器的频率在计时过程中不能发生变化
这个定时器可能是不一定是CPU的时钟频率还有可能是芯片组计时器,电源管理计时器或者其他的计时器


高性能计数的设计目标
1 精确度达到纳秒级的高精度计时器
2 不受其他技术干扰 例如动态节能技术,根据处理器的使用情况自动调节它的电压、频率和功耗

1 操作系统检测系是否内置了高性能时钟,如果有就直接利用该时钟。。

如果没有高性能时钟,计时器将使用其他频率一致的时钟,例如芯片组,BIOS等


在多核处理器中,该函数要确保在同一个CPU上获取开始时间和结束时间,系统调用 QueryPerformanceCounter 时要在检测采用哪个CPU的频

率的时候,就会产生系统开销,如果用来比较原始代码和更改之后的代码进行性能比较,那么产生的系统开销可以相互抵消

多线程调用SetThreadAffinityMask目的是为了限制线程在哪个CPU下工作。

但是 “为什么” 还没有解决 有哪位高手如何再深入讲些
Eleven 2012-05-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

QueryPerformanceCounter是查询定时器的计数值,如果硬件里有定时器,它就会启动这个定时器,并且不断获取定时器的值,这样的定时器精度,就跟硬件时钟的晶振一样精确的,这就是原理
[/Quote]
NX~
向立天 2012-05-05
  • 打赏
  • 举报
回复
QueryPerformanceCounter是查询定时器的计数值,如果硬件里有定时器,它就会启动这个定时器,并且不断获取定时器的值,这样的定时器精度,就跟硬件时钟的晶振一样精确的,这就是原理

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧