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

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; 
}

 

你可能感兴趣的:(数据结构)