Linux下计时函数有很多种,精度比较高的是clock_gettime(),其函数原型如下,
#include <time.h>
int clock_gettime(clockid_t clk_id, struct timespec *tp);
struct timespec的定义如下,
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
可以看到clock_gettime()的时间精度是纳秒,比gettimeofday()更加精确。
时钟选择
使用clock_gettime()时要给定一个时钟,这个时钟有以下几种,
时钟 | 解释 |
---|---|
CLOCK_REALTIME | 计量1970年1月1日到现在的时间 |
CLOCK_REALTIME_COARSE | 与CLOCK_REALTIME类似,但是速度快精度低 |
CLOCK_MONOTONIC | 计量系统启动后到现在的时间 |
CLOCK_MONOTONIC_COARSE | 与CLOCK_MONOTONIC类似,但是速度快精度低 |
CLOCK_MONOTONIC_RAW | 从硬件计时器计量系统启动后到现在的时间 |
CLOCK_BOOTTIME | 与CLOCK_MONOTONIC类似,但是会记录系统挂起时流逝的时间 |
CLOCK_PROCESS_CPUTIME_ID | 计量进程里所有线程消耗的CPU时间 |
CLOCK_THREAD_CPUTIME_ID | 线程相关的,计量CPU的时间 |
常规来说,选择CLOCK_REALTIME 或CLOCK_MONOTONIC就行了,但是要记住这2者的区别,下面以代码解释它们之间的区别,
#include <time.h>
#include <stdio.h>
int main(void)
{
struct timespec ts1, ts2;
clock_gettime(CLOCK_REALTIME, &ts1);
clock_gettime(CLOCK_MONOTONIC, &ts2);
printf("ts1 --- sec: %d, nsec: %d\n", ts1.tv_sec, ts1.tv_nsec);
printf("ts2 --- sec: %d, nsec: %d\n", ts2.tv_sec, ts2.tv_nsec);
return 0;
}
打印如下,
可以看到:
- 当选择CLOCK_REALTIME时,得到的时间时1970年1月1日到现在的时间跨度
- 当选择CLOCK_MONOTONIC时,得到的时间是系统启动后到现在的时间跨度
关于这2者区别的详细描述,可以参考这篇文章
相比于gettimeofday(),clock_gettime()更加精确,而且可以选择时钟,gettimeofday()只能计算1970年1月1日到现在的时间跨度。
如果有写的不对的地方,希望能留言指正,谢谢阅读。