使用C++在Windows/Linux下精确计时

在Windows和Linux下有多种计时方式,包括Windows定时器(精度大约在15ms),借助CPU的多媒体定时器(精度在1ms左右)。然而在计算机主板上都有专门的时钟芯片,可以提供极为精确的时间,在选择计时方式时,要考虑到,获取约精确的时间,就要耗费更多的资源,在实际编程时应根据使用条件选择合理的计时方式。这篇博客将介绍Windows/Linux下获取精确时间的方法,并提供一个封装较好的简单计时类。

Windows下,精确获取时间的函数需要包含Windows.h

#include <Windows.h>

class Timer{
public:
	void StartWatchTimer(){
		QueryPerformanceFrequency(&m_liPerfFreq);
		QueryPerformanceCounter(&m_liPerfStart);
	}

	float ReadWatchTimer(){
		char temp[64];
		QueryPerformanceCounter(&liPerfNow);
		dfTim = (((liPerfNow.QuadPart - m_liPerfStart.QuadPart) * 1000.0f) / m_liPerfFreq.QuadPart);//单位为ms
		return dfTim;
	}

	operator float(){
		return dfTim;
	}

protected:
	LARGE_INTEGER m_liPerfFreq;
	LARGE_INTEGER m_liPerfStart;
	LARGE_INTEGER liPerfNow;
	double dfTim;
};

使用

	Timer __t;
	__t.StartWatchTimer();
	// your code
	// ...
	__t.ReadWatchTimer("SAC-IA Time");
	double runtime = __t;

Linux下,没有写成类封装的形式,大致意思是一样的,使用和上面相同。

#include <sys/time.h>
#include <stack>

stack<timeval> ts;

void StartWatchTimer()
{
	timeval t;
	gettimeofday(&t, NULL);
	ts.push(t);
}

void ReadWatchTimer(const char* info)
{
	timeval t1, t2;
	float elapsed;
	gettimeofday(&t2, NULL);
	if(!ts.empty())
	{
		t1 = ts.top();
		ts.pop();
		elapsed = (t2.tv_sec-t1.tv_sec)+(t2.tv_usec-t1.tv_usec)/1000000.f;
		printf("%15s | elapsed[%ld]:%fs\n", info, ts.size(), elapsed);
	}
}

在Linux下使用这两个函数的方法和Windows下差不多,Start开始计时,Read读取秒表。

 

 

发表评论