QPC の場合、呼び出しQueryPerformanceFrequency
て更新レートを取得できます。を使用していない限りtime
、とにかく 0.5 秒以上のタイミング精度が得られますが、clock
それほど正確ではありません - 多くの場合、10 ミリ秒のセグメントです [ただし、明らかにCLOCKS_PER_SEC
100 万で標準化されているため、数値がより正確になります]。
これらの線に沿って何かを行うと、測定できるギャップがどれほど小さいかを理解できます[ただし、非常に高い周波数では、クロックサイクルごとに更新されるタイムスタンプカウンターなど、その読み取りに20時間かかるなど、その小ささに気付かない場合があります-40 クロックサイクル]:
time_t t, t1;
t = time();
// wait for the next "second" to tick on.
while(t == (t1 = time())) /* do nothing */ ;
clock_t old = 0;
clock_t min_diff = 1000000000;
clock_t start, end;
start = clock();
int count = 0;
while(t1 == time())
{
clock_t c = clock();
if (old != 0 && c != old)
{
count ++;
clock_t diff;
diff = c - old;
if (min_diff > diff) min_diff = diff;
}
old = c;
}
end = clock();
cout << "Clock changed " << count << " times" << endl;
cout << "Smallest differece " << min_diff << " ticks" << endl;
cout << "One second ~= " << end - start << " ticks" << endl;
明らかに、同じ原則を他のタイムソースに適用できます。
(コンパイルテストは行っていませんが、タイプミスやミスが多すぎないことを願っています)
編集:したがって、10秒の範囲で時間を測定している場合、100Hzで実行されるタイマーは1000の「ティック」を提供します。しかし、運に応じて 999 または 1001 になる可能性があり、正しいか間違っているかを判断すると、2000 ppm になります。クロック入力も変動する可能性がありますが、変動ははるかに小さく、最大で 100 ppm です。Linux の場合、clock()
は 100Hz で更新されます (OS を実行する実際のタイマーはより高い頻度で実行される場合がありますがclock()
、Linux では 100Hz または 10ms 間隔で更新されます [そして、CPU が使用されている場合にのみ更新されるため、5 秒座ってユーザー入力待ちは0回です]。
Windows では、clock()
使用されている CPU だけでなく、腕時計と同じように実際の時間を測定するため、ユーザー入力を待機する 5 秒は 5 秒の時間としてカウントされます。それがどれほど正確かはわかりません。
あなたが見つけるもう一つの問題は、現代のシステムは一般的に反復可能なタイミングがあまり得意ではないということです - あなたが何をしても、OS、CPU、およびメモリはすべて一緒に共謀して、同じ量の時間を得るために人生を悲惨なものにします2回実行します。最近の CPU は、適切に密閉されたコンピュータ ボックスから「こっそりと出てくる」可能性のある EMC (電磁適合性) テスト スパイクの電磁放射を減らすために、意図的に可変クロック (約 0.1 ~ 0.5% のドリフトが許容されます) で実行されることがよくあります。
言い換えれば、非常に標準化された時計を手に入れることができたとしても、あなたが何もできないその他の要因に応じて、テスト結果は少し上下します...
要約すると、時計の精度のために ppm 番号が必要なフォームに入力する数値を探していて、その情報を入力できない政府のフォームでない限り、私は完全には確信していません。時間自体を測定するために使用されるタイマーの精度を知ることは非常に役立ちます。他の要因が少なくとも大きな役割を果たすからです。