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日到現在的時間跨度。

如果有寫的不對的地方,希望能留言指正,謝謝閱讀。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章