在windows下可以通過QueryPerformanceFrequency()和QueryPerformanceCounter()等系列函數來實現計時器的功能。
根據其函數說明,其精度能夠達到微秒級,但是需要硬件中的計時器來支持。至於具體怎么樣的硬件能夠支持,查了很多資料都沒有詳細說明;而另外一些資料也說明,如果底層硬件不支持,這兩個API就會返回類似於GetTickCount()的精度結果。一般情況下可以放心的使用。
這里就把自己一直用的計時器分享一下,已經簡單將其封裝成類的形式,大家可以將其加入到常用的工具組件里面,方便使用:
#include<iostream>
#include<Windows.h>
using namespace std;
class CTimer
{
public:
CTimer(void);
~CTimer(void);
int time_in();
double time_out();
private:
LARGE_INTEGER litmp;
LONGLONG qt1, qt2;
double dft, dff, dfm;
};
CTimer::CTimer(void)
{
}
CTimer::~CTimer(void)
{
}
int CTimer::time_in()
{
QueryPerformanceFrequency(&litmp);//獲得時鍾頻率
dff = (double)litmp.QuadPart;
QueryPerformanceCounter(&litmp);//獲得初始值
qt1 = litmp.QuadPart;
return 1;
}
double CTimer::time_out()
{
QueryPerformanceCounter(&litmp);//獲得終止值
qt2 = litmp.QuadPart;
dfm = (double)(qt2 - qt1);
dft = dfm / dff;//獲得對應的時間值
return dft;
}
int main()
{
CTimer timer;
timer.time_in();
for (size_t i = 0; i < 10000; i++)
{
const size_t num = 200 * 1024;
char *tmp = new char[num];
memset(tmp, 0, num);
delete[] tmp;
tmp = nullptr;
}
cout<<"申請堆耗時:"<<timer.time_out()<<endl;
timer.time_in();
for (size_t i = 0; i < 10000; i++)
{
const size_t num = 200 * 1024;
char tmp[num];
memset(tmp, 0, num);
}
cout << "申請棧耗時:" << timer.time_out() << endl;
return 0;
}
這里的例子分別計算了申請堆和申請棧的時間,其運行結果如下: