社区
硬件/系统
帖子详情
求助高手QueryPerformanceFrequency为什么精确
二分掌柜的
优质创作者: 人工智能技术领域
2012-05-05 03:22:39
求助高手QueryPerformanceFrequency为什么精确,需要原理
...全文
3100
15
打赏
收藏
求助高手QueryPerformanceFrequency为什么精确
求助高手QueryPerformanceFrequency为什么精确,需要原理
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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是查询定时器的计数值,如果硬件里有定时器,它就会启动这个定时器,并且不断获取定时器的值,这样的定时器精度,就跟硬件时钟的晶振一样精确的,这就是原理
Query
Performance
Counter &
Query
Performance
Frequency
精确
获得系统时间
本文介绍在Windows环境下使用
Query
Performance
Counter()和
Query
Performance
Frequency
()函数进行
精确
计时的方法,包括毫秒级和微秒级的定时操作,适用于需要高精度计时的应用场景。
Query
Performance
Frequency
精确
获取时间
本文介绍了Windows系统中实现高精度计时的方法,包括
Query
Performance
Frequency
和
Query
Performance
Counter两个API函数的作用及使用方式,并通过示例代码展示了如何获取系统高精度计数器的频率。
时间函数
Query
Performance
Frequency
本文介绍了多种时间函数,包括Sleep、MFC的timer事件、C语言的Time、clock、GetTickCount及
Query
Performance
Frequency
等,详细探讨了它们的工作原理、用途及精度,并通过一个具体的类实现展示了如何使用
Query
Performance
Frequency
进行高精度计时。
Query
Performance
Frequency
基本介绍
精确
获取时间
Query
Performance
Frequency
是一个Win32API函数,用于获取硬件高精度计数器的频率,以便与
Query
Performance
Counter配合使用来实现
精确
的时间测量。通过调用
Query
Performance
Counter在事件前后获取计数,并结合
Query
Performance
Frequency
得到的频率,可以计算出事件的
精确
时间。测试发现,使用Sleep函数的精度相对较低。
Query
Performance
Frequency
本文介绍了Win32API中的
Query
Performance
Frequency
()和
Query
Performance
Counter()函数,这两个函数用于获取计算机硬件支持的高精度计时器的频率及当前计数值。通过使用这些函数可以实现对事件发生的
精确
计时。
硬件/系统
2,644
社区成员
17,229
社区内容
发帖
与我相关
我的任务
硬件/系统
VC/MFC 硬件/系统
复制链接
扫一扫
分享
社区描述
VC/MFC 硬件/系统
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章