我想知道發生兩個事件之間已經過去的時間。現在處理系統時間變化
,簡單的方法是使用類似:
time_t x, y;
x = time(NULL);
/* Some other stuff happens */
y = time(NULL);
printf("Time passed: %i", y-x);
然而,有可能是系統時間在這兩個事件之間改變。
是否有另一種方法來了解兩個事件之間已經過去的時間?或者有沒有辦法檢測系統時間的變化?
我想知道發生兩個事件之間已經過去的時間。現在處理系統時間變化
,簡單的方法是使用類似:
time_t x, y;
x = time(NULL);
/* Some other stuff happens */
y = time(NULL);
printf("Time passed: %i", y-x);
然而,有可能是系統時間在這兩個事件之間改變。
是否有另一種方法來了解兩個事件之間已經過去的時間?或者有沒有辦法檢測系統時間的變化?
既然你在Linux上是很明顯,你可以使用POSIX CLOCK_MONOTONIC時鐘得到一個計時器,是系統時間更改的影響:
struct timespec ts1, ts2;
clock_gettime(CLOCK_MONOTONIC, &ts1);
/* Things happen */
clock_gettime(CLOCK_MONOTONIC, &ts2);
ts2.tv_sec -= ts1.tv_sec;
ts2.tv_nsec -= ts1.tv_nsec;
if (ts2.tv_nsec < 0)
{
ts2.tv_nsec += 1000000000L;
ts2.tv_sec -= 1;
}
printf("Elapsed time: %lld.%09lds\n", (long long)ts2.tv_sec, ts2.tv_nsec);
要檢查系統支持CLOCK_MONOTONIC,檢查sysconf(_SC_MONOTONIC_CLOCK) > 0
。
您可以在Linux上使用clock_gettime()或在其他一些Unix系統上使用gethrtime()。雖然兩個這樣的值之間的差異會給你一個時間間隔,但這些調用並不會給你定期的時間值。正如HP-UX關於gethrtime()所述:
gethrtime()函數返回當前的高分辨率實時。時間以過去一定時間以來的納秒錶示。
如果使用clock_gettime(),則需要指定CLOCK_MONOTONIC - 如果支持。如果系統時鐘改變,使用正常選項CLOCK_REALTIME將導致不準確。 – Dipstick