Linux 时间函数 (time() / clock() / gettimeofday()) 简介与比较
本文将对Linux系统时间函数
gettimeofday()
与标准库函数time()
clock()
进行简单介绍,并比较差异。
Introduction
最近笔者的一个项目需要使用计时功能,同时使用POSIX的多线程函数进行多线程操作。在计时过程中,出现了一些Bug,导致计时结果错误。经过研究找到了问题,也由此发现了上述几个函数之间的差异。
Linux系统库 sys/time.h
系统库提供了计时器timer相关功能,以及下面介绍的函数gettimeofday()
。另外,其中定义了一个描述更加精确时间的结构体timeval
,定义如下:
struct timeval
{
__time_t tv_sec; /* Seconds. */
__suseconds_t tv_usec; /* Microseconds. */
};
tv_sec
以秒为单位的时间tv_usec
以微秒为单位的时间
gettimeofday()
函数修改一个结构体struct timeval
的值,原型声明如下:
int gettimeofday (struct timeval *__restrict __tv,
void *__restrict __tz) __THROW __nonnull ((1));
功能:
- 将
timeval
结构体中的tv_sec
置为距离当天开始的时间tv_usec
置为当前微秒数- 返回的是绝对时间
标准库time.h
标准库提供了一系列通用计时函数,如time()
clock()
等,其返回类型都以宏time_t
定义,一般为long
:
clock_t clock (void);
time_t time (time_t *__timer);
time()
time()
函数返回当前秒数。并将秒数放入__timer中(如果timer非空)。
clock()
返回程序目前使用的时间(user time + system time),以时钟跳数为单位,换算关系为:
sec = clock / CLOCKS_PER_SEC; //CLOCKS_PER_SEC 定义在time.h中
Compare
从上面加粗文本可以看出,clock
和gettimeofday
两函数最大的区别是:
gettimeofday
返回绝对时间,不受程序执行的影响clock
返回的是相对时间,是程序执行的时间
程序执行时间受到进程调度、阻塞等影响,而绝对时间不会。
所以,当需要统计包含子程序在内的时间时,还是需要以绝对时间相减的形式计算,而不能使用clock
简单统计,clock
只能统计父进程的执行时间。