0

Stopwatchのインスタンスを開始しましたが、別のスレッドからElapsedMillisecondsを読みたいと思います:

var diff = myStopwatch.ElapsedMilliseconds - someOtherValue;

ただし、同じスレッドで実行されていると仮定してコンパイラがコードを最適化することを読んだことがあります。これにより、実行された正確な時点で実際の値を取得するのではなく、上記の行がレジストリから値を読み取る可能性があります。これは私に影響しますか?もしそうなら、どうすれば回避できますか?

4

1 に答える 1

2

ストップウォッチはQueryPerformanceCounter() winapi 関数をピンボークしますが、最適化はまったく影響しません。winapi 関数は、ハードウェア抽象化レイヤーである HAL に依存して、カウンター ソースを提供します。最も一般的なのは、チップセットで使用可能なカウンターです。Stopwatch.Frequency プロパティが公開される理由は、異なるマシンが異なるチップセットを使用するためです。それに応じて異なる HAL 実装であるため、マザーボードにクーティがないという確固たる保証はありません。Microsoft は、MSDN 記事の次の注記でその責任をカバーしています。

マルチプロセッサ コンピュータでは、どのプロセッサが呼び出されるかは重要ではありません。ただし、基本入出力システム (BIOS) またはハードウェア アブストラクション レイヤー (HAL) のバグにより、異なるプロセッサでは異なる結果が得られる可能性があります。スレッドのプロセッサ アフィニティを指定するには、SetThreadAffinityMask 関数を使用します。

この種のバグは、20 年前にはまったく珍しいことではなく、今日では前代未聞でした。

于 2013-10-06T20:26:40.823 に答える