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