如何高精度计算任务的运行时间

前言: 对于应用系统中频繁用到的核心算法,我们往往需要比较精确计算出该算法时间代价,本人通过查阅各种资料,发现以下方法是精度极高的时间计算方法:

 

几个基本概念: 秒(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等机器配置有关

 

你可能感兴趣的:(算法)