2011-01-23 17 views
1

POSIXで提供されているgettimeofday()関数の粒度をチェックする方法はありますか?時間単位の粒度関数

+0

標準の解像度はマイクロ秒です - 「gettimeofday()関数は、エポックから秒とマイクロ秒で表される現在の時刻を取得する」 プログラム的な方法があるかどうか質問していますかシステムクロックの分解能がマイクロ秒未満であることを確認することはできますか? – 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; 
     } 
} 

粒度が(タスク切り替えに起因する可能性があり、数百または数千外れ値で約50/50 1または2マイクロ秒)の周りに2マイクロ秒であるようです。

+0

差をフォーマットするのにかかる時間を計算しているため、遅延を過大評価しています。 'cur =!cur;'の直後に 'gettimeofday(&timevals [!cur]、NULL);'を呼び出して、呼び出し間のギャップを最小限にする必要があります。あなたのマシンは、1マイクロ秒で2回の 'gettimeofday()'呼び出しを行うのに十分速いので、結果はたいていゼロであることが分かります。 CPUが3GHzで動作する場合、マイクロ秒は3000クロックサイクルであることを忘れないでください。あなたは3000クロックサイクルで非常に多くを行うことができます。 –

3

gettimeofday()の代わりに、clock_gettime()CLOCK_REALTIMEクロックを指定)を使用することを検討してください。これはPOSIXでもあり、解像度を取得するための関数clock_getres()をサポートしています。

+0

しかし、 'clock_getres'は、実際のタイマー解決の代わりにhrtimersに対して常に1nsを返します。 – osgx

-1

)(gettimeofdayの解像度を得るために、現在のPOSIXの方法は、古いバージョンでPOSIX

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

(変化が起こったときにわからない)で、値CLOCKS_PER_SECは、#defineで定義されました。

+3

CLOCKS_PER_SECは標準Cで、' clock() 'に適用されます。 '_SC_CLK_TCK'は' times() 'に適用されます。 'gettimeofday()'にも適用されません。 –

関連する問題