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

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

 

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值