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