JavaScriptでマイクロ秒を測定する新しい方法があります:http :
//gent.ilcore.com/2012/06/better-timer-for-javascript.html
ただし、過去に、JavaScriptでミリ秒タイマーから0.1ミリ秒の精度を取得する大まかな方法を見つけました。不可能な?いいえ。読み続けます:
セルフチェックのタイマー精度を必要とする高精度の実験を行っていますが、特定のシステムの特定のブラウザーで0.1ミリ秒の精度を確実に得ることができました。
高速システムの最新のGPU高速化Webブラウザー(たとえば、i7クアッドコア、いくつかのコアがアイドル状態、ブラウザーウィンドウのみ)で、タイマーがミリ秒精度であることが信頼できることがわかりました。実際、アイドル状態のi7システムでは非常に正確になり、1,000回を超える試行で正確に同じミリ秒を確実に取得できました。余分なWebページの読み込みなどを実行しようとする場合にのみ、ミリ秒の精度が低下します(前後の時間チェックを実行して、自分自身の低下した精度を正常にキャッチできます。処理時間が突然1ミリ秒以上に長くなりました-これは、CPUの変動による悪影響が多すぎると思われる結果を無効にするのに役立ちます)。
i7クアッドコアシステムの一部のGPUアクセラレートブラウザー(ブラウザーウィンドウが唯一のウィンドウの場合)で非常に正確になり、JavaScriptで0.1ミリ秒の精度タイマーにアクセスできればいいのにと思った。一部のハイエンドブラウジングシステムでは、高精度を必要とする特定の種類のニッチアプリケーションに対してタイマーの精度を価値のあるものにし、アプリケーションが精度の偏差を自己検証できるようにします。
複数のパスを実行している場合は、明らかに複数のパス(例:10パス)を実行し、10で除算して0.1ミリ秒の精度を得ることができます。これは、精度を上げる一般的な方法です。複数のパスを実行し、合計時間をパスの数で割ります。
しかし、非常にユニークな状況のために特定のテストのベンチマークパスを1つしか実行できない場合、これを実行することで0.1(場合によっては0.01ミリ秒)の精度を取得できることがわかりました。
初期化/キャリブレーション:
- タイマーが次のミリ秒に増加するまで待機するビジーループを実行します(タイマーを次のミリ秒間隔の開始に合わせます)このビジーループは1ミリ秒未満続きます。
- タイマーがインクリメントするのを待っている間に、別のビジーループを実行してカウンターをインクリメントします。カウンターは、1ミリ秒に発生したカウンター増分の数を示します。このビジーループは1ミリ秒続きます。
- 数値が非常に安定するまで(読み込み時間、JITコンパイラなど)、上記を繰り返します。4. 注意:数値の安定性により、アイドルシステムで達成可能な精度が得られます。精度をセルフチェックする必要がある場合は、分散を計算できます。一部のブラウザでは差異が大きく、他のブラウザでは差異が小さくなっています。より速いシステムではより大きく、より遅いシステムではより遅くなります。一貫性も異なります。どのブラウザが他のブラウザよりも一貫性/正確性が高いかがわかります。システムが低速でビジーなシステムでは、初期化パス間の差異が大きくなります。これにより、ブラウザが0.1msまたは0.01msの測定を可能にするのに十分な精度を提供していない場合、警告メッセージを表示する機会が与えられます。タイマースキューは問題になる可能性がありますが、一部のシステムの一部の整数ミリ秒タイマーは非常に正確に増分します(ドットのすぐ上)。これにより、信頼できる非常に一貫したキャリブレーション値が得られます。
- 最終カウンター値(または最後の数回のキャリブレーションパスの平均)を保存します
1ミリ秒未満の精度で1つのパスをベンチマークします。
- タイマーが次のミリ秒に増分するまで待機するために、ビジーループを実行します(タイマーを次のミリ秒間隔の開始に合わせます)。このビジーループは1ミリ秒未満続きます。
- 時間を正確にベンチマークするタスクを実行します。
- タイマーを確認してください。これにより整数ミリ秒が得られます。
- 最後のビジーループを実行して、タイマーのインクリメントを待機しながらカウンターをインクリメントします。このビジーループは1ミリ秒未満続きます。
- このカウンター値を、初期化からの元のカウンター値で除算します。
- これで、ミリ秒の小数部分を取得しました!!!!!!!!
警告:ビジーループはWebブラウザーでは推奨されませんが、幸い、これらのビジーループはそれぞれ1ミリ秒未満で実行され、ごくわずかしか実行されません。
JITコンパイルやCPUの変動などの変数は非常に不正確になりますが、いくつかの初期化パスを実行すると、完全な動的再コンパイルが行われ、最終的にカウンターは非常に正確なものに落ち着きます。すべてのビジーループがすべてのケースでまったく同じ機能であることを確認し、ビジーループの違いが違いにつながらないようにします。結果を信頼し始める前に、すべてのコード行が数回実行されていることを確認してください。これにより、JITコンパイラーは完全な動的再コンパイル(dynarec)にすでに安定しています。
実際、特定のシステムでは精度がマイクロ秒に近づくのを見ましたが、まだ信頼できません。しかし、0.1ミリ秒の精度は、私が唯一のブラウザーページであるアイドル状態のクアッドコアシステムで、非常に確実に機能するようです。私は(一意の変数が発生したため)1回限りのパスしか実行できず、複数の繰り返しパスを平均化するのではなく、各パスの正確な時間を計測する必要がある科学的テストケースになりました。そのため、これを行いました。
いくつかのプレパスとダミーパス(ダイナレックを安定させるため)を実行し、0.1msの精度(数秒間安定した状態)の信頼性を確認してから、ベンチマークが発生している間、キーボード/マウスから手を離しました。 0.1ms精度の信頼性を検証するためのポストパス(再び安定した状態)。これはまた、電源状態の変更やその他の事柄が、前と後の間に発生せず、結果に干渉しなかったことを確認します。すべてのベンチマークパス間で事前テストと事後テストを繰り返します。これに関して、私はその間の結果が正確であることを事実上確信していた。もちろん、保証はありませんが、場合によってはWebブラウザーで0.1ms未満の正確な精度が可能であることを示しています。
この方法は、非常にニッチなケースでのみ役立ちます。それでも、文字通り100%無限に保証されるわけではありません。内部および外部検証の複数のレイヤーと組み合わせると、非常に信頼できる正確さ、さらには科学的正確さを得ることができます。