本文对Windows及Linux平台下常用的计时函数进行总结,包括精度为秒、毫秒、微秒三种精度的各种函数。
比如Window平台下特有的Windows
API函数GetTickCount()、timeGetTime()、及QueryPerformanceCounter(),
Linux平台下特有的gettimeofday()函数,以及标准的C/C++函数time()和clock()。下面分别对此进行简单介绍并附上示例代码。
通用的C/C++计时函数time()和clock()
time_t time(time_t
*timer);
返回以格林尼治时间(GMT)为标准,从1970年1月1日00:00:00到现在的此时此刻所经过的秒数。
time_t实际是个long长整型typedef
long time_t;
clock_t
clock(void);
返回进程启动到调用函数时所经过的CPU时钟计时单元(clock
tick)数,在MSDN中称之为挂钟时间(wal-clock),以毫秒为单位。
clock_t实际是个long长整型typedef long
clock_t;
Window平台特有函数
DWORD
timeGetTime(void);
返回系统时间,以毫秒为单位。系统时间是从系统启动到调用函数时所经过的毫秒数。注意,这个值是32位的,会在0到2^32之间循环,约49.71天。
DWORD WINAPI
GetTickCount(void);
这个函数和timeGetTime()一样也是返回系统时间,以毫秒为单位。
高精度计时,以微秒为单位(1毫秒=1000微秒)。
BOOL
QueryPerformanceCounter(LARGE_INTEGER
*lpPerformanceCount);得到高精度计时器的值(如果存在这样的计时器)。
BOOL
QueryPerformanceFrequency(LARGE_INTEGER
*lpFrequency);返回硬件支持的高精度计数器的频率(次每秒),返回0表示失败。
其中LARGE_INTEGER其实是一个联合体,可以得到__int64
QuadPart;也可以分别得到低32位DWORD LowPart和高32位的值LONG
HighPart。
在使用时,先使用QueryPerformanceFrequency()得到计数器的频率,再计算二次调用QueryPerformanceCounter()所得的计时器值之差,
用差去除以频率就得到精确的计时了。
Linux平台特有函数
int
gettimeofday(struct timeval *tv,struct timezone
*tz);
获得当前精确时间(1970年1月1日到现在的时间),精度为微秒。
保存时间的结构体
strut timeval
{
long tv_sec; //秒数
long tv_usec; //微秒数
};