利用高精度计时器计算程序运行时间_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > 利用高精度计时器计算程序运行时间

利用高精度计时器计算程序运行时间

 2010/12/12 14:52:44  hanyezhiyu8  http://inuts.javaeye.com  我要评论(0)
  • 摘要:QueryPerformanceFrequency()类型:Win32API原型:BOOLQueryPerformanceFrequency(LARGE_INTEGER*lpFrequency);作用:返回硬件支持的高精度计数器的频率。返回值:非零,硬件支持高精度计数器;零,硬件不支持,读取失败。QueryPerformanceCounter原型:BOOLQueryPerformanceCounter(LARGE_INTEGER*ipPerformanceCount);返回值
  • 标签:程序 运行 利用 程序运行时间
QueryPerformanceFrequency()
类型:Win32API
原型:BOOL?QueryPerformanceFrequency(LARGE_INTEGER?*lpFrequency);
作用:返回硬件支持的高精度计数器的频率。
返回值:非零,硬件支持高精度计数器;零,硬件不支持,读取失败。
 
QueryPerformanceCounter
原型:BOOL?QueryPerformanceCounter(LARGE_INTEGER?*ipPerformanceCount);?  
返回值:如果安装的硬件支持高精度计时器,函数将返回非0值.?如果安装的硬件不支持高精度计时器,函数将返回0.?
作用:用于得到高精度计时器的值(如果存在这样的计时器)
参数:LARGE_INTEGER?*ipProformanceCount?  
为一个指针变量用于函数传值,即指向现时计数器的值.
如果安装的硬件不支持高精度计时器,该参数将返回0.
 
数据类型LARGEINTEGER既可以是一个作为8字节长的整数,也可以是作为两个4字节长的整数的联合结构,其具体用法根据编译器是否支持64位而定。该类型的定义如下:
  typeef?union?_?LARGE_INTEGER
  {
??????  ?struct
?????????  ?{
????????????????  ?DWORD?LowPart;
???????????????????  ?LONG?HighPart;
?????????  ?};
?????????  ?LONGLONG?QuadPart;
  }?LARGE_INTEGER;
 
在定时前应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。
接着在需要严格计时的事件发生前和发生之后分别调用QueryPerformanceCounter(),利用两次获得的计数之差和时钟频率,就可以计算出事件经历的精确时间。
测试函数SLEEP(100)的精确持续时间方法:
????LARGE_INTEGER?litmp;
????LONGLONG?qt1,qt2;
????double?dft,dff,dfm;
????QueryPerformanceFrequency(&litmp);//获得时钟频率
????dff=(double)litmp.QuadPart;
????QueryPerformanceCounter(&litmp);//获得初始值
????qt1=litmp.QuadPart;Sleep(100);
????QueryPerformanceCounter(&litmp);//获得终止值
????qt2=litmp.QuadPart;
????dfm=(double)(qt2-qt1);
????dft=dfm/dff;//获得对应的时间值
需要注意的是DFT计算的结果单位是秒。
 
例子

LARGE_INTEGER  frequency;
LARGE_INTEGER  startTime;
LARGE_INTEGER  endTime;   

//获取是否支持精确定时器
BOOL bRes = QueryPerformanceFrequency(&frequency);
if (TRUE == bRes)
{
    //Record the start time
    QueryPerformanceCounter(&startTime);

    //Execute Program

    //Record the end time
    QueryPerformanceCounter(&endTime);

    //Calculate the cost time
    double dInterval = (double)(endTime.QuadPart - startTime.QuadPart);
    double dCostTime = dInterval / (double)frequency.QuadPart * 1000.0; 
}

?

发表评论
用户名: 匿名