在Windows下可以用系统提供的API函数 QueryPerformanceFrequency 和 QueryPerformanceCounter 来进行高精度的计时,现在的机器基本上都提供这种高精度的计时啦,所以不用担心。利用该函数可以精确的计时到微妙级别。msdn的描述见这里。
QueryPerformanceFrequency() 可以得到CPU的时钟频率。
QueryPerformanceCounter() 可以通过两次的差值来得到CPU的时钟周期差值。
这样就可以计算出两次差值之间所花费的时间,当然这里计算出来的时间是秒,一般都换算为毫秒或者微妙来表示。
下面我把该函数封装到了一个类里面,直接用起来还是比较方便的,代码也比较简单,下面就直接贴代码了。
#include <iostream>
#include <Windows.h>
//#include <QFile>
//#include <QString>
//#include <QByteArray>
class MyTimer{
private:
LARGE_INTEGER large_integer;
__int64 IntStart;
__int64 IntEnd;
double DobDff;
double DobMillseconds;
public:
MyTimer(){};
void TimerStart(){
QueryPerformanceFrequency(&large_integer);
DobDff = large_integer.QuadPart;
QueryPerformanceCounter(&large_integer);
IntStart = large_integer.QuadPart;
}
double TimerFinish(){
QueryPerformanceCounter(&large_integer);
IntEnd = large_integer.QuadPart;
DobMillseconds = (IntEnd - IntStart) * 1000 / DobDff; //转为ms
return DobMillseconds;
}
//当然这个可以不要,根据测试需要添加
// void OutputToFile(QString fileName){
// QFile file(fileName);
// if(!file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text))
// return;
// QByteArray data = QByteArray("The Timer of millseconds is: ")
// + QByteArray::number(DobMillseconds) + QByteArray("ms\n");
// file.write(data);
// file.close();
// }
};
int main ()
{
MyTimer timer;
timer.TimerStart();
Sleep(1.321);
double tm = timer.TimerFinish();
std::cout << tm << std::endl;
// timer.OutputToFile("C:/timer.txt");
}
类似的结果如下: