Linux下计时函数clock_gettime()的时钟选择

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日到现在的时间跨度。

如果有写的不对的地方,希望能留言指正,谢谢阅读。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值