注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Hao的博客

I'm on my way……

 
 
 

日志

 
 
 
 

获取程序执行的精确时间(C++)  

2010-12-26 23:15:08|  分类: 编程杂记 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

      在某些时候,我们需要计算某个程序或函数的执行时间,而且要求一定的精确度。我们可以利用硬件支持的高精度计数器来实现,而API中有两个函数可以调用该计数器,这两个函数的原型是:
      
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)
      BOOL QueryPerformanceCounter(LARGE_INTEGER *lpCount)

      这两个函数分别用于获取高精度计数器频率和当前计数值。如果硬件不支持高精度计数器,这两个函数均返回0。参数类型LARGE_INTEGER既可以是一个8字节的整数,也可以是两个4字节整数的联合结构,其具体用法根据编译器是否支持64位而定。该类型定义如下:

      typedef union _LARGE_INTEGER{
          struct{
              DWORD LowPart;
              LONG HighPart;
          };
          LONGLONG QuadPart;
      }LARGE_INTEGER;

      在定时前先调用QueryPerformanceFrequency函数获得机器内部计数器的时钟频率。接着在需要严格计时的程序或函数前后分别调用QueryPerformanceCounter函数,利用两次获得的计数之差和时钟频率,就可以计算出经历的精确时间。测试函数Sleep(100)的精确时间代码如下:

      double GetExecutionTime(){
          LARGE_INTEGER freq, cnt1, cnt2;
          QueryPerformanceFrequency(&freq);   //获取时钟频率
          QueryPerformanceCounter(&cnt1);      //获取计数器初始值
          Sleep(100);                                         //可以替换执行其他需要测试的程序或函数
          QueryPerformanceCouter(&cnt2);        //获取计数器终止值
          return (double)(cnt2.QuadPart-cnt1.QuadPart)/(double)freq.QuadPart;  //返回时间值(秒)
      }

  评论这张
 
阅读(1541)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017