16

Interval プロパティのデータ型として double を使用する Microsoft の背後にある考え方に苦労しているため、これは少し学術的な質問です!

まず MDSN から Interval は Elapsed イベント間のミリ秒単位の時間です。私はそれを離散数であると解釈しますが、なぜ double を使用するのでしょうか? 確かに int または long の方が理にかなっています!?

間隔は 5.768585 (5.768585 ミリ秒) のような値をサポートできますか? 特に、System.Timers.Timer の精度がミリ秒未満であると考えると... .NET で最も正確なタイマーは?

私には少しばかげているようです..多分私は何かが欠けています!

4

2 に答える 2

13

逆アセンブルは、呼び出しによって間隔が消費されることを示している(int)Math.Ceiling(this.interval)ため、実数を指定した場合でも、int使用前に変換されます。これは、と呼ばれるメソッドで発生しUpdateTimerます。

なんで?わからない、おそらく仕様はそれdoubleが一時的に必要であり、それが変わったと言っていましたか?最終的にはに変換され、とにかくドキュメントによると大きくすることはできないdoubleため、厳密には必要ありません。intInt32.MaxValue

はい、タイマーは実数を「サポート」できますが、それが黙ってそれらを変更したことを通知するだけではありません。でタイマーを初期化して実行できます。タイマーは100.5dに変わります101

そして、はい、それはすべて少し厄介です:4つの無駄なバイト、潜在的な暗黙のキャスト、変換呼び出し、明示的なキャスト、それらがちょうど使用された場合はすべて不要ですint

于 2012-07-23T10:34:00.883 に答える
4

ここで double を使用する理由は、十分な精度を提供するためです。

詳細: システム割り込みタイム スライスは、によって返されるActualResolutionNtQueryTimerResolution()によって与えられます。NtQueryTimerResolution は、ネイティブ Windows NT ライブラリ NTDLL.DLL によってエクスポートされます。システム時間の増分は、 によって返されるTimeIncrementGetSystemTimeAdjustment()によって与えられます。

これら 2 つの値は、システム タイマーの動作を決定します。これらは整数値であり、100 ns 単位を表します。しかし、これは今日の特定のハードウェアではすでに不十分です。一部のシステムでは、0.9766 ミリ秒に相当する 9766 というActualResolutionが返されます。しかし実際には、これらのシステムは 1 秒あたり 1024 回の割り込みで動作しています (マルチメディア インターフェイスの適切な設定によって調整されています)。1 秒間に 1024 回の割り込みがあると、割り込み期間は 0.9765625 ms になります。これは詳細度が高すぎるため、100 ps 領域に達するため、標準のActualResolution形式では保持できません。

したがって、そのような時間パラメータを double に入れることが決定されました。ただし: これは、すべての可能な値がサポート/使用されていることを意味するわけではありません。TimeIncrementによって指定された粒度は、何があっても持続します。

タイマーを扱うときは、関連するパラメーターの粒度を確認することを常にお勧めします。

質問に戻ります。Can Interval support values like 5.768585 (ms) ?

いいえ、上記の例で取り上げたシステムではできません。

しかし、5.859375 (ms) をサポートできます!

ハードウェアが異なる他のシステムでは、他の番号がサポートされている場合があります。

したがって、ここで double を導入するという考えは、それほどばかげた考えではなく、実際には理にかなっています。物事を最終的に正しくするためにさらに 4 バイトを費やすことは、良い投資です。

ここでは、Windows の時刻に関する詳細をまとめました。

于 2012-07-24T09:54:30.120 に答える