C++一種高精度計時器


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

這里的例子分別計算了申請堆和申請棧的時間,其運行結果如下:
圖1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM