VC精确计时

来源:互联网 发布:mac os sierra gm下载 编辑:程序博客网 时间:2024/05/22 04:49

1、WM_TIMER消息映射
SetTimer()设置定时间隔,定时响应函数  OnTimer()
计时精度30ms,定时器消息在多任务操作系统中的优先级很低,不能得到及时响应。

2、sleep()函数
计时精度30ms,CPU占用率高,延时期间不能处理其他的消息。

3、COleDateTime类和COleDateTimeSpan类结合WINDOWS的消息处理过程
计时精度秒级。

4、GetTickCount()函数
在较短的定时中其计时误差为15ms,在较长的定时中其计时误差较低,CPU占用率高。

这个函数并非实时发送,而是由系统每18ms发送一次,因此其最小精度为18ms。当需要有小于18ms的精度计算时,应使用StopWatch方法进行。

5、多媒体定时器函数DWORD timeGetTime(void)
精度为ms级

6、多媒体定时器timeSetEvent()函数
精度为ms级

7、QueryPerformanceFrequency()和QueryPerformanceCounter()函数
误差不超过1微秒,精度与CPU等机器配置有关。
(现在好像都用这种方式了)

第一个函数返回PC机8253芯片的FCLK,这个值约1.19MHz,也就是说一秒钟可发出这么多的计时信号,它的倒数约840ns,这是定时器的极限精度了。 
第二个函数返回定时信号个数,求差,再乘840ns,就是时间了。 

例如:

// #include "mmsystem.h"
// #pragma comment(lib, "winmm.lib")

LONGLONG   t1,t2; 
LONGLONG   persecond; 
QueryPerformanceFrequency((LARGE_INTEGER   *)&persecond);//询问系统一秒钟的频率 


QueryPerformanceCounter((LARGE_INTEGER   *)&t1); 
//下面是你要计算运行时间的程序代码 
... 
QueryPerformanceCounter((LARGE_INTEGER   *)&t2); 


double time=(t2-t1)/persecond; (单位:秒)


======================================================================== 
QueryPerformanceCounter()这个函数返回高精确度性能计数器的值,它可以以微妙为单位计时.但是QueryPerformanceCounter()确切的精确计时的最小单位是与系统有关的,所以,必须要查询系统以得到QueryPerformanceCounter()返回的嘀哒声的频率.QueryPerformanceFrequency()提供了这个频率值,返回每秒嘀哒声的个数.计算确切的时间是从第一次调用QueryPerformanceCounter()开始的假设得到的LARGE_INTEGER   为nStartCounter,过一段时间后再次调用该函数结束的,设得到nStopCounter.两者之差除以QueryPerformanceFrequency()的频率就是开始到结束之间的秒数.由于计时函数本身要耗费很少的时间,要减去一个很少的时间开销.但一般都把这个开销忽略.公式如下: 
                              nStopCounter-nStartCounter 
  ElapsedTime=------------------------------------     -   overhead 
                                      frequency 

double   time=(nStopCounter.QuadPart-nStartCounter.QuadPart)/frequency.Quad 
================================================================================= 

 

小结:以上提到常用的9种时间函数,由于他们的用处不同,所以他们的精度也不尽相同,所以如果简单的延时可以用sleep函数,稍微准确的延时可以使用clock函数,GetTickCount函数,更高级的实用timeGetTime函数;简单的定时事件可以用Timer,准确地可以用timeSetEvent;或取一般系统时间可以通time,或者CTime,或者COleDateTime,获取准确的时间可以用clock,或者GetTickCount函数,或者timeGetTime函数,而获取准确地系统时间要使用硬件支持的QueryPerformanceFrequency函数,QueryPerformanceCounter函数。

原创粉丝点击