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