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