2013-11-01 5 views
6

1ms보다 더 정확하게 시간을보고하는 시간 서비스를 구현하려고합니다. 나는 초기 측정을하고 StopWatch를 사용하여 델타를 추가하는 것이 쉬운 해결책이라고 생각했습니다. 문제는이 방법이 벽 시간에서 매우 빠르게 갈라지는 것입니다. 나는 비교적 최근의 단절 하드웨어에 대한 2ms의/분의 속도로 발산하고C#에서 고해상도 DateTime.UtcNow를 구현하는 가장 좋은 방법은 무엇입니까?

public static void Main(string[] args) 
{ 
    System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch(); 
    DateTime baseDateTime = DateTime.UtcNow; 
    s.Start(); 
    long counter = 0; 
    while(true) 
    { 
     DateTime utcnow = DateTime.UtcNow; 
     DateTime hpcutcnow = baseDateTime + s.Elapsed; 
     Console.WriteLine(String.Format("{0}) DT:{1} HP:{2} DIFF:{3}", 
      ++counter, utcnow, hpcutcnow, utcnow - hpcutcnow)); 
     Thread.Sleep(1000); 
    } 
} 

예를 들어, 다음 코드는 벽 시간 내 높은 해상도 시계 사이의 차이를 측정하려고합니다.

Windows에 또 다른 시간 기능이 있습니다. 정확하지 않을 수도 있습니다. 그렇지 않다면 고해상도 클록이나 써드 파티 라이브러리를 만드는 더 나은 방법이 있습니까?

+2

질문 :'DateTime.UtcNow'가 당신에게 충분히 정확하지 않다면, 당신은 당신의 시간 서비스를하기 위해 무엇을 사용할 것입니까? – StriplingWarrior

+0

@ Hans의 위대한 답변 외에도 하드웨어 장치 ("고가의 크리스털 발진기"가있는 것)를 사용하여이를 수행하려고 시도 할 것이라고 덧붙입니다. Windows 박스에서 [ms 사용 시간]을 전송할 수 있는지 확실하지 않습니다. –

답변

8

정확한 시계를 얻는 것은 어렵습니다. 스톱워치는 매우 높은 해상도를 가지고 있지만 정확한 것은 아니며 칩셋의 신호에서 주파수를 추출합니다. 일반적인 전자 부품 공차에서 작동합니다. 하드웨어 사업에서의 경쟁으로 인해 주파수가 보장되고 안정적인 비싼 크리스털 발진기가 선점되었습니다.

DateTime.UtcNow 모두 정확하지는 않지만 도움이됩니다. Windows는 정기적으로 시간 서비스에 연결하며 기본값은 time.windows.com이며 고품질 시계 업데이트를 얻습니다. 그리고 그것을 사용하여 기계의 시계를 재조정하고 작은 조정을 삽입하여 시계가 따라 잡거나 천천히 움직 이도록합니다.

정확한 밀리 초를 얻으려면 더 큰 트릭이 필요합니다. 인터럽트 우선 순위에서 실행되는 커널 모드에서 실행되는 코드에 대해서만 보장 할 수 있기 때문에 다른 코드와 코드 및 데이터 페이지가 페이지 잠금으로 선점 될 수 없으므로 페이지 폴트가 발생하지 않습니다 . 상용 솔루션은 온도 안정을 위해 오븐에서 작동하는 오실레이터로 백업 된 GPS 위성의 클럭 신호를 읽기 위해 GPS 라디오를 사용합니다. 그런 시계를 읽는 것은 어려운 문제입니다. 시간이 걸렸을 때와 마찬가지로 운영 체제가이를 사용하는 프로그램을 선점 할 때까지 밀리 세컨드 이하의 클럭 소스를 많이 사용하지 않아야합니다. ~ 45 msec. 또는 더 나쁜.

DateTime.UtcNow는 15.625 밀리 초까지 정확하며 시간 서비스 업데이트로 인해 매우 오랜 기간 안정적입니다. 그것보다 낮게가는 것은별로 의미가 없다. 사용자 모드에서 실행을 보장하기 위해 실행을 보장 할 수는 없다.

4

분명히 Windows 8/Server 2012에는 고해상도 타임 스탬프를 얻는 데 특별히 새로운 API 인 GetSystemTimePreciseAsFileTime API가 추가되었습니다. 나는 이것으로 놀 수있는 기회가 없었지만, 그것은 유망 해 보인다.