我寫了一些代碼,使用緊密循環來監控Stopwatch的輸出。該循環跟蹤自上次迭代以來已經過去的滴答數。我觀察到每秒20次500微秒的跳躍,而大多數其他迭代需要1秒鐘。秒錶似乎在緊密循環的迭代之間跳躍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效應? – 2012-03-23 21:51:43
如果用存儲器替換console.writeline代碼以列出變量,然後在循環完成後立即打印所有時序,會發生什麼情況? – rism 2012-03-23 21:59:58