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日到現在的時間跨度。
如果有寫的不對的地方,希望能留言指正,謝謝閱讀。