windows高精度记时方法:
这个方法调用两个函数:
- QueryPerformanceFrequency() 获取计算机内部高精度事件定时器的频率
- QueryPerformanceCounter() 获取计算机内部高精度事件定时器自上电以来时钟周期数,与CPU频率无关
记时原理:
将两个时间点的QueryPerformanceCounter相减,得到在这段时间内计时器记录的次数,有了计数次数,再乘以每次的时间(频率的倒数)就得到了总共消耗的时间了。
函数原型
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);
//LARGE_INTEGER定义如下,我们只用到这个联合体的QuadPart部分
typedef union _LARGE_INTEGER {
struct {
ULONG LowPart;
LONG HighPart;
} DUMMYSTRUCTNAME;
struct {
ULONG LowPart;
LONG HighPart;
} u;
LONGLONG QuadPart;
} LARGE_INTEGER;
简单的例子
#include<windows.h>
#include<iostream>
using namespace std;
void fun()
{
Sleep(100);//睡100毫秒
}
int main()
{
double runtime;
LARGE_INTEGER frequency; //frequency,用来储存计数器的频率
LARGE_INTEGER start; //start用来储存开始时计数器的计数
LARGE_INTEGER end; //end用来储存结束时计数器的计数
//QueryPerformanceFrequency(&frequency)把获得的计数器频率储存到frequency.QuadPart中
//若此电脑不支持高精度计时器,则函数返回值为0
if (QueryPerformanceFrequency(&frequency))
{
//把此刻的计数器次数值储存到start.QuadPart中
QueryPerformanceCounter(&start);
fun();
//把此刻的计数器次数值储存到end.QuadPart中
QueryPerformanceCounter(&end);
//总时间=次数差/频率
//乘1000000是为了把单位换算成微秒
//也可以乘1000来把单位换算成毫秒
////但是一定要注意,一定要把*1000与(end.QuadPart - start.QuadPart)放在一起
runtime = (end.QuadPart - start.QuadPart) * 1000 * 1000 / frequency.QuadPart;
cout<<"调用fun()函数一共消耗了 " << runtime << " (微秒)" << endl;
}
else
{
cout << "不支持高精度计时器" << endl;
}
system("pause");
}
网友评论