2015-02-02 5 views
1

.NET Stopwatch을 재미있게 구현하려고 시도했지만 예상치 못한 결과가 발생했습니다.Thread.Sleep으로 체크하면 스톱워치가 정확하지 않은 이유는 무엇입니까?

이 프로그램에서 약 100ms의 실행 시간이 예상됩니다.

Stopwatch 클래스가 정확하지 않거나 여기 무슨 일이 벌어지고 있습니까?

번호 : 적어도 N 대와 MCSE :

namespace Timer 
{ 
    class Program 
    { 
     Stopwatch s = new Stopwatch(); 

     static void Main(string[] args) 
     { 
      s.Start(); 
      for (int i = 0; i < 100; i++) 
      { 
       Thread.Sleep(1); 
      } 
      s.Stop(); 

      Console.WriteLine("Elapsed Time " + s.ElapsedMilliseconds + " ms"); 

      Console.ReadKey(); 
     } 
    } 
} 

결과 190 ms

+5

코드 붙여 넣기를 복사하여 붙여 넣으십시오. –

+3

... uff ... 'Thread.Sleep (n)'이 (가) n-msecs가 아니기 때문에 * 도와 드리겠습니다. –

+0

먼저 Thread.Sleep을 호출 할 때 오버 헤드 스위칭 스레드가 있습니다. 둘째로 쓰레드가 1ms 후에 돌아올 수는 없다. – BoeseB

답변

9

Thread.Sleep(n) 때문에 수단이다.

얼마 전에 I wrote an answeran external reference을 포함, (하지만 다른 주제에) :

Thread.Sleep(n) 수단 타임 슬라이스 (또는 스레드 퀀텀)의 적어도 수 의 현재 스레드를 차단 그 n 내에서 발생할 수 있습니다 밀리 초. 타임 슬라이스의 길이는 Windows 및 다른 프로세서의 버전/유형에 따라 다르며 일반적으로 15-30 밀리 초입니다. 즉, 스레드가 에 대해 n 밀리 초를 초과하여 거의 차단된다는 것을 의미합니다. 귀하의 스레드가 번이 정확히 n 밀리 초 후에 다시 깨질 가능성은 대략 불가능하므로 수 있습니다. 의 경우 Thread.Sleep은 무의미합니다.

MSDN에 따르면

:

시스템 클럭이 특정 속도로 틱 시계 해상도를했다. 지정된 시간 초과가 시계 틱과 일치하도록 조정되므로 실제 시간 초과가 지정된 시간 초과와 정확히 일치하지 않을 수 있습니다. 당신은 실시간 OS에없는 때문에

1

이 프로그램은 뭔가에 의해 중단 될 수 있으며, 당신이 스레드 (밀리 초)이이에 될 것 대기도 있기 때문에, 이런 일이됩니다 chanches을 증가 절전 모드 사용 최소 n 밀리 초. 일반 Thread.Sleep (100)으로 시도하면 아마 더 가까운 것을 찾을 수있을 것입니다.