前言: 对于应用系统中频繁用到的核心算法,我们往往需要比较精确计算出该算法时间代价,本人通过查阅各种资料,发现以下方法是精度极高的时间计算方法:
几个基本概念: 秒(s) 毫秒(ms) 微秒(us) 纳秒(ns)
1s = 1000ms
1ms = 1000us
1us = 1000ns
对于精确度要求高的定时操作,则应该使用QueryPerformanceFrequency()和QueryPerformanceCounter(), 这两个函数要求计算机从硬件上支持精确定时器
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
BOOL QueryPerformanceCounter(LARGE_INTEGER *lpCount);
在进行定时之前,先调用QueryPerformanceFrequency()函数获得机器内部定时器的时钟频率,然后在需要严格定时的事件发生之前和发生之后分别调用QueryPerformanceCounter()函数,利用两次获得的计数之差及时钟频率,计算出事件经历的精确时间。下列代码实现1ms的精确定时:
LARGE_INTEGER litmp;
LONGLONG Begin, End;
double dfMinus, dfFreq, dfTime;
QueryPerformanceFrequency(&litmp);
dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率
QueryPerformanceCounter(&litmp);
Begin = litmp.QuadPart;// 获得初始值
//执行你的任务
QueryPerformanceCounter(&litmp);
End = litmp.QuadPart;//获得中止值
//计算本次任务的计数之差
dfMinus = (double)(QPart2-QPart1);
//获得对应的时间值,单位为秒
dfTime = dfMinus /dfFreq;
其定时误差不超过1微秒,精度与CPU等机器配置有关