在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读取秒表。