5

ソフトウェアタイマーの精度を特徴付けたいと思います。私はそれがどれほど正確であるかについてはあまり心配していませんが、正確さが何であるかを知る必要があります.

c 関数の clock() と、WinAPI の関数 QPC と timeGetTime を調査しましたが、これらはすべてハードウェアに依存していることがわかります。

私は約 5 ~ 10 秒かかるプロセスを測定していますが、私の要件は単純です。必要なのは 0.1 秒の精度 (解像度) だけです。しかし、最悪の場合の精度を知る必要があります。

より高い精度が望まれますが、精度が向上した (1 ミリ秒) と信じて文書化できないよりも、精度が低い (500 ミリ秒) ことを知り、それを説明したいと思います。

ソフトウェアクロックの精度を特徴付ける方法について誰か提案がありますか?

ありがとう

4

3 に答える 3

1

あなたは確かな事実を尋ねたので、ここにそれらがあります:

典型的な周波数制御デバイスHPETsCB3LV-3I-14M31818 で、-40 °C から +85 °C の間で +/- 50ppm の周波数安定性を指定しています。より安価なチップはCB3LV-3I-66M6660です。このデバイスの周波数安定度は、-20°C ~ 70°C で +/- 100 ppm です。

ご覧のとおり、50 ~ 100ppm では、50 ~ 100 us/s、180 ~ 360 ms/hour、または 4.32 ~ 8.64 s/日のドリフトが発生します。

を制御するデバイスRTCは通常、多少優れています。RV-8564-C2 RTC モジュールは、+/- 10 ~ 20 ppm の許容範囲を提供します。より厳しい公差は、通常、軍用バージョンまたはリクエストに応じて入手できます。このソースの偏差は、HPET の偏差の 5 分の 1 です。ただし、それでも 0.86 秒/日です。

上記の値はすべてデータシートに記載されている最大値です。私のコメントで述べたように、典型的な値はかなり小さいかもしれませんが、それらは数ppmの範囲にあります。

周波数値には熱ドリフトも伴います。の結果はQueryPerformanceCounter()、ACPI 電源管理タイマー チップで動作するシステムの熱ドリフトの影響を大きく受ける場合があります ()。

タイマーの詳細:クロックとタイマー回路.

于 2013-08-22T07:08:28.673 に答える
0

QPC の場合、呼び出しQueryPerformanceFrequencyて更新レートを取得できます。を使用していない限りtime、とにかく 0.5 秒以上のタイミング精度が得られますが、clockそれほど正確ではありません - 多くの場合、10 ミリ秒のセグメントです [ただし、明らかにCLOCKS_PER_SEC100 万で標準化されているため、数値がより正確になります]。

これらの線に沿って何かを行うと、測定できるギャップがどれほど小さいかを理解できます[ただし、非常に高い周波数では、クロックサイクルごとに更新されるタイムスタンプカウンターなど、その読み取りに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 番号が必要なフォームに入力する数値を探していて、その情報を入力できない政府のフォームでない限り、私は完全には確信していません。時間自体を測定するために使用されるタイマーの精度を知ることは非常に役立ちます。他の要因が少なくとも大きな役割を果たすからです。

于 2013-08-21T00:26:50.610 に答える