6

Stopwatch.GetTimestamp() を使用すると、戻り値を記録し、それを呼び出して前の戻り値と比較し続けると、最終的には元の値よりも小さい値が返されることがわかりますが、予測できません。

これは予想される動作ですか?

製品コードでこれを行う目的は、マイクロ秒の正確なシステム時間を確保することです。

この手法では、DateTime.UtcNow を呼び出し、Stopwatch.GetTimestamp() を originalUtcNow および originalTimestamp としてそれぞれ呼び出します。

その時点から、アプリケーションは単純に Stopwatch.GetTimestamp() を呼び出し、Stopwatch.Frequency を使用して originalTimestamp 変数との差を計算し、その差を originalUtcNow に追加します。

次に、出来上がり...効率的で正確なマイクロ秒の DateTime です。

しかし、Stopwatch.GetTimestamp() が低い数値を返すことがあります。

めったに起こりません。そんな時は「リセット」して継続しよう、というのが私たちの考えです。

ただし、Stopwatch.GetTimestamp() の精度を疑ったり、.Net ライブラリにバグがあるのではないかと疑ったりします。

これに光を当てることができるなら、そうしてください。

参考までに、現在のタイムスタンプ値、頻度、および long.MaxValue に基づいて、ハードウェアの問題でない限り、寿命中にロールオーバーする可能性は低いようです。

編集:現在、この値を「スレッドごと」に計算し、「クランプ」してコア間のジャンプを監視してリセットしています。

4

4 に答える 4

6

スレッドがコアをジャンプしているため、時間内にジャンプする可能性があります。このページの「メモ」を参照してください: http://msdn.microsoft.com/en-us/library/ebf7z0sw.aspx

于 2012-01-24T01:00:49.920 に答える
2

Stopwatch クラスの動作は、ハードウェア サポートに応じてシステムごとに異なります。

参照: http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.ishighresolution.aspx

また、基になる同等の win32 呼び出し ( QueryPerformanceCounter ) には有用なドキュメントが含まれていると思います: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644904(v=vs.85).aspx

于 2012-01-24T01:01:44.143 に答える
1

後方への実行 (後方への小さな変更のように聞こえます) について正確にはわかりませんが、これまでに Stopwatch.GetTimestamp() の値が非常に大きく変化し、それ以降の計算でオーバーフロー例外が発生する可能性があることを 3 回経験しました。 nは大きな値ですが、ストップウォッチが極端に飛び回っていなければ、プログラムはオーバーフロー例外なしで何年も実行できるほど小さい値です
(Stopwatch.GetTimestamp() - ProgramStartStopwatchTimestamp) * n
。これらの例外は、プログラムが開始されてから何時間も後に発生したことにも注意してください。したがって、問題は、開始直後にストップウォッチが少し逆方向に実行されただけではありません。どの方向でも、まったく異なる範囲にジャンプしました。

ストップウォッチのロールオーバーに関しては、上記のケースのいずれかで (違いではなく、ストップウォッチが) 0xFF4 のような値を取得しましたか? ???? ???? ????ということで、ロールオーバー寸前のレンジまで跳ね上がりました。プログラムを複数回再起動した後でも、この新しい範囲は一貫して有効でした。とにかくジャンプを処理する必要があることを考えると、それがもはや重要な場合...

タイムスタンプが取得されたコアを特定することがさらに必要な場合は、実行中のコア番号を知ることが役立つ可能性があります。この目的のために、GetCurrentProcessorNumber(Server 2003 および Vista 以降でGetCurrentProcessorNumberEx使用可能) および (Server 2008 R2 および Windows 7 以降で使用可能) と呼ばれる機能があります。その他のオプション (Windows XP を含む) については、この質問の回答も参照してください。
コア番号は、スケジューラによっていつでも変更できることに注意してください。しかし、ストップウォッチのタイムスタンプを読み取る前と後でコア番号を読み取ると、コア番号が同じままである場合、ストップウォッチの読み取りもこのコアで実行されたと推測できます...

于 2013-12-19T16:58:59.653 に答える