빡빡한 루프를 사용하여 스톱워치의 출력을 모니터링하는 코드를 작성했습니다. 이 루프는 마지막 반복 이후에 경과 된 틱 수를 추적합니다. 대부분의 다른 반복은 < 1μs 걸리는 반면, 나는 초당 500 마이크로 초의 점프를 20 번 관찰하고 있습니다.스톱워치가 빡빡한 루프의 반복 사이에서 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 효과를 제거하기 위해 프로그램에서 테스트 코드를 두 번 실행하려고 시도 했습니까? –
console.writeline 코드를 store to list 변수로 바꾸고 루프가 완료된 후 즉시 모든 타이밍을 출력하면 어떻게됩니까? – rism