2011-01-23 77 views
1

有什麼辦法來檢查由POSIX提供的gettimeofday()函數的粒度?粒度在時間函數

+0

我不清楚你的問題:每標準分辨率爲微秒 - 「有gettimeofday()函數將獲取當前時間,表示爲自紀元秒和毫秒」 你是問是否有一種編程方式檢查系統時鐘的分辨率是否小於1微秒? – RomanK

+1

@RomanK:分辨率和粒度不是一回事。 POSIX確實指定了微秒,但在給定的實現中,這些微秒每次只能增加1000, – caf

回答

1

在緊密的循環中調用它,注意當前值和前一個值之間的差異。像下面這樣:

#include <stdio.h> 
#include <sys/time.h> 

int main() 
{ 
     struct timeval timevals[2]; 
     int cur = 0; 
     while (1) { 
       gettimeofday(&timevals[cur], NULL); 
       int diff = timevals[cur].tv_usec - timevals[!cur].tv_usec; 
       if (diff) 
         printf("%d\n", diff); 
       cur = !cur; 
     } 
} 

在我的系統似乎粒度約2微秒(約50/50一個或兩個微秒,在這很可能是由於任務切換成百上千異常值)。

+0

由於您正在計算格式化差異所用的時間,因此您高估了延遲。你應該在'cur =!cur;'後立即調用'gettimeofday(&timevals [!cur],NULL);'以使調用之間的差距最小化。您可能會發現結果通常爲零 - 因爲您的機器足夠快,可以在一微秒內完成兩個'gettimeofday()'調用。不要忘記,如果您的CPU以3 GHz運行,則微秒爲3000個時鐘週期;你可以在3000個時鐘週期內做很多事情。 –

3

而不是gettimeofday(),考慮使用clock_gettime()(指定CLOCK_REALTIME時鐘)。這也是POSIX,並支持clock_getres()函數來獲得分辨率。

+0

但是'clock_getres'總是會返回1 ns,而不是實時定時器分辨率.... – osgx

-1

目前POSIX的方式來獲得gettimeofday的分辨率()是

#include <unistd.h> 
long ticks_per_sec = sysconf(_SC_CLK_TCK); 

在舊的POSIX版本(當發生變化不能確定),該值CLOCKS_PER_SEC被#define的。

+3

CLOCKS_PER_SEC是標準C,適用於'clock()'; '_SC_CLK_TCK'適用於'times()'。 'gettimeofday()'也不適用。 –