我編寫了一個簡單的程序來確定我的系統是RHEL 5.5 VM(內核2.6.18-194)上的納秒精度。CLOCK_REALTIME內核中的納秒級精度支持
// cc -g -Wall ntime.c -o ntime -lrt
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char* argv[]) {
struct timespec spec;
printf("CLOCK_REALTIME - \"Systemwide realtime clock.\":\n");
clock_getres(CLOCK_REALTIME, &spec);
printf("\tprecision: %ldns\n", spec.tv_nsec);
clock_gettime(CLOCK_REALTIME, &spec);
printf("\tvalue : %010ld.%-ld\n", spec.tv_sec, spec.tv_nsec);
printf("CLOCK_MONOTONIC - \"Represents monotonic time. Cannot be set.\":\n");
clock_getres(CLOCK_MONOTONIC, &spec);
printf("\tprecision: %ldns\n", spec.tv_nsec);
clock_gettime(CLOCK_MONOTONIC, &spec);
printf("\tvalue : %010ld.%-ld\n", spec.tv_sec, spec.tv_nsec);
return 0;
}
輸出示例:
CLOCK_REALTIME - "Systemwide realtime clock.":
precision: 999848ns
value : 1504781052.328111000
CLOCK_MONOTONIC - "Represents monotonic time. Cannot be set.":
precision: 999848ns
value : 0026159205.299686941
所以REALTIME
給我的本地時間和MONOTONIC
系統的正常運行時間。兩個時鐘似乎都有μs的精確度(999848ns×1ms),即使在納秒內輸出MONOTONIC
,這也是令人困惑的。
man clock_gettime
狀態:
CLOCK_REALTIME_HR CLOCK_REALTIME的高分辨率版本。
然而,grep -R CLOCK_REALTIME_HR /usr/include/ | wc -l
回報0
,並試圖編譯error: ‘CLOCK_REALTIME_HR’ undeclared (first use in this function)
結果。
我試圖確定我是否可以以毫微秒的精度獲取本地時間,但是我的代碼有一個錯誤,或者這個功能在5.5中不完全支持(或者虛擬機的HPET關閉,或其他) 。
可以我在本系統中獲得本地時間(納秒)嗎?我究竟做錯了什麼?
編輯
那麼答案似乎是第
雖然可以達到納秒的精度,系統並不能保證在這種情況下精確到納秒(這裏的差別清晰answer而比咆哮)。典型的COTS硬件並沒有真正處理它(另一個answer在正確的方向)。
我仍然好奇爲什麼時鐘報告相同的clock_getres
分辨率,但MONOTONIC
產生什麼似乎是納秒值,而REALTIME
產生微秒。
在Linux中幾乎沒有微秒的精度,明確地說不是納秒!也許你混淆精度和分辨率? **很**不同的東西!這味道很像XY問題。爲什麼你想要得到ns分辨率呢? – Olaf
精確度很容易,精確度不高。 –
'我可以在這個系統中獲得納秒級的本地時間嗎?'系統中的哪個位置?移動這樣的值(例如,從內核調用中返回)會使其失效。 –