2012-03-23 1 views
0

빡빡한 루프를 사용하여 스톱워치의 출력을 모니터링하는 코드를 작성했습니다. 이 루프는 마지막 반복 이후에 경과 된 틱 수를 추적합니다. 대부분의 다른 반복은 < 1μs 걸리는 반면, 나는 초당 500 마이크로 초의 점프를 20 번 관찰하고 있습니다.스톱워치가 빡빡한 루프의 반복 사이에서 500μs 건너 뛰는 것처럼 보입니다

누군가 내가 왜이 점프를보고 있는지 설명 할 수 있습니까?

나는 시도했다 :

  1. 설정 프로세서 선호도 (효과 없음)
  2. 릴리스 빌드 디버거 외부에서 실행
  3. 변경 스레드 우선 순위 (최고는/AboveNormal가 생김한다)
  4. 최적화

내 코드는 다음과 같습니다.

 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; 
      } 
     } 
+0

JIT 효과를 제거하기 위해 프로그램에서 테스트 코드를 두 번 실행하려고 시도 했습니까? –

+0

console.writeline 코드를 store to list 변수로 바꾸고 루프가 완료된 후 즉시 모든 타이밍을 출력하면 어떻게됩니까? – rism

답변

5

대부분의 경우 선점 형 작업 전환이 표시됩니다. 운영 체제가 프로그램을 일시 중단 한 후 다른 프로그램을 실행하는 경우입니다. Windows 95 (Win 3.1 및 이전 버전에서는 협업 멀티 태스킹이 가능하여 원하는만큼 CPU를 유지할 수 있기 때문)입니다.

그런데 정확하게 실행 시간을 정하는 더 좋은 방법이 있습니다 : QueryThreadCycleTime. 코드가 실행될 때만 CPU주기를 계산하므로 이러한 일시 중지는 제외됩니다.

+0

Win 3.1은 실제로 DOS 응용 프로그램에 대한 선점 형 멀티 태스킹과 Windows 응용 프로그램 용 협업 멀티 태스킹을 수행했습니다. –

+0

+1 for QueryThreadCycleTime – rism

+0

스레드 우선 순위를 최상으로 설정하지 않는 것이 선점을 줄이거 나 방지하지 않습니까? 가장 높게 설정하면 점프 수가 초당 20에서 초당 200으로 변경됩니다. –

3

테스트가 실제로 이해가되지 않습니다 ... 귀하의 프로세스가 귀하의 컴퓨터에서 실행할 수있는 유일한 프로세스는 아닙니다. 시스템은 각 스레드에 차례로 프로세서 시간을 제공하므로 루프가 전혀 실행되지 않는 시간이 있으므로 "점프"가 설명됩니다.

관련 문제