タイトなループを使ってストップウォッチの出力を監視するコードを書きました。このループは、最後の反復から経過したティックの数を追跡します。私は500マイクロ秒のジャンプを毎秒20回観測していますが、他のほとんどの反復は<1μsです。ストップウォッチはタイトループの繰り返しの間に500μsジャンプするようです
なぜ私はこれらのジャンプを見ているのか説明できますか?
私が試した:
- デバッガ
- の外のリリースでビルド実行中のスレッドの優先度(最高/ AboveNormalは物事を悪化させる)
- を変更するプロセッサアフィニティ(効果なし)
- を設定します最適化
私のコードは以下のとおりです。
Stopwatch sw = new Stopwatch();
int crossThresholdCount = 0;
long lastElapsedTicks = 0;
long lastPrintTicks = 0;
Console.WriteLine("IsHighResolution: " + Stopwatch.IsHighResolution);
Console.WriteLine("Frequency: " + Stopwatch.Frequency);
sw.Start();
long thresholdTicks = 5000; // 10000 ticks per ms
while (true)
{
long tempElapsed = sw.ElapsedTicks;
long sincePrev = tempElapsed - lastElapsedTicks;
lastElapsedTicks = tempElapsed;
if (sincePrev > thresholdTicks)
crossThresholdCount++;
// print output
if (crossThresholdCount > 0 && tempElapsed - lastPrintTicks > TimeSpan.TicksPerSecond)
{
lastPrintTicks = tempElapsed;
Console.WriteLine("crossed " + crossThresholdCount + " times");
crossThresholdCount = 0;
}
}
JIT効果を排除するためにプログラムで2回テストコードを実行しようとしましたか? –
console.writelineコードをstore to list変数に置き換えて、ループが完了した後ですぐにすべてのタイミングを出力するとどうなりますか? – rism