2014-02-09 8 views
2

DateTime.Now (또는 DateTime.UtcNow)은 시스템 타이머 해상도에서만 정확하다는 것을 알고 있습니다. "문서화되지 않은"함수 NtSetTimerResolution이 있지만 doesn't affect the current time입니다. 저는 이미 DateTime.UtcNow의 시작 값과 추가 된 Stopwatch 카운터의 하이브리드 솔루션을 사용하여 최대 정밀도를 마이크로 초로 낮추었습니다. 실제로는 잘 작동하지만 시스템의 여러 프로세스에서 오는 시간 값과 비교하지 않습니다.정확히 언제 DateTime.Now가 업데이트 되었습니까?

이제 기본 시간을 더 보정하고 싶습니다. DateTime.Now의 정확도를 높일 수 없다면 적어도 그 값이 다음 값으로 업데이트 될 때를 알고 싶습니다. 나는 값이 변할 때까지 너무 오랫동안 돌아간 루프를 생각하고있다. 그런 다음 그것을 사용하고 즉시 스톱워치를 시작한다. 이 같은

뭔가 (테스트되지 않은)

DateTime t0 = DateTime.UtcNow; 
DateTime baseTime; 
Stopwatch stopwatch = new Stopwatch(); 
while ((baseTime = DateTime.UtcNow) == t0); 
stopwatch.Start(); 

내 가정이 변경되는 값 기다리는 나에게보고 된 값이 정확있는 순간을 제공하는 것이 맞습니까? 예를 들어 공통 로그에보고하는 모든 응용 프로그램에서이 작업을 수행하면 현재보다 훨씬 더 많은 시간 값을 가져야합니다. (나는 동기화 수준의 정확도를 얻고 싶지는 않지만 더 나은 정보를 얻고 싶다.)

NtSetTimerResolution 함수를 사용하여 약간의 테스트를 해본 결과 최대 해상도로 설정하고 루프에서 DateTime.UtcNow 값을 비교했다. . 값이보다 정확하고 정확합니다 (여기서 구별 할 수 없음). 그러나 나는 내가 여기에서 무엇을 보는지 확신하지 못한다. 그리고 프로그램 시작시 현재 해상도가 매번 달라졌습니다. 다른 프로세스와 간섭하는지 확신 할 수 없으므로 프로덕션 코드에서 문제를 일으키지 않는 것이 좋습니다.

+0

주문 하시겠습니까? 어떤 종류의 "정확한"당신이 말하는거야? ("절대적인"정확도는 물론 NTP 서버와 같은 절대 시계에 대한 시스템 클록의 정확도에 따라 달라집니다.) –

+1

엄격한 시간 측정에 관심이 있다면 그 동안의 긴 루프는 많은 CPU 사이클을 소비합니다. 측정중인 작업에 영향을 미칠 수 있습니다. –

+0

로컬 정확도이면 충분합니다. Windows는 기본적으로 며칠마다 NTP 소스를 사용합니다. 물론이 루프는 프로세스를 초기화 할 때 한 번만 수행됩니다. 또한'baseTime.Add (stopwatch.Elapsed)'를 사용합니다. 루프는 16ms를 넘지 않아야합니다. – ygoe

답변

0

NtSetTimerResolution()은 시스템 타이머 해상도를 변경합니다. 이 의미에서 이것은 timeBeginPeriod/timeEndPeriod과 매우 유사하게 보입니다. 그러나 NtSetTimerResolution은 더 높은 해상도를 지원하는 하드웨어에서 1ms 미만의 타이머 해상도를 사용할 수 있습니다. 한계를 조사하려면 NtQueryTimerResolution을 사용하십시오. XP보다 Windows를 실행하는 최신 하드웨어는 0.5ms 해상도를 지원합니다.

어떻게 이것이 시간에 영향을 줍니까? 음, Windows> XP에서는 시스템 시간 (시스템 파일 시간) 또는 시스템 시간의 업데이트 간격에 대한 세분성이 타이머 해상도에 의해 주어진 시스템 하트 비트에 의해 결정됩니다.

예 :

1) 윈도우 7, NtQueryTimerResolution 5000 (100 NS 단위의 최대 해상도를 반환). NtSetTimerResolution을 사용하면 시스템 하트 비트를 0.5ms로 설정할 수 있습니다. 시스템 시간 (감지 할 적절한 해상도를 얻기 위해 GetSystemTimeAsFileTime 사용)은 0.5ms 단위로 증가합니다. 따라서 현재 시간이 영향을받습니다.

2) Windows> XP, timeBeginPeriod (1)는 시스템 하트 비트를 1ms로 변경하지만 시간 단위는 낮게 유지됩니다. 시스템 시간 단위는 Windows XP의 타이머 해상도에 의존하지 않습니다.

... NtSetTimerResolution 함수는 현재 시간에는 영향을주지 않습니다.

있습니다. MSDN:자주 호출하면 시스템 클럭, 시스템 전력 사용량 및 스케줄러에 큰 영향을 줄 수 있으므로 timeBeginPeriod 호출시주의하십시오. 그러나 MS는 여기에서 설명서를 업데이트하지 못했습니다. 시스템 시간에 미치는 영향은 Windows 8.1 시간 계 획 스키마에서 제거되었습니다.BTW : timeBeginPeriodtimeEndPeriodNtSetTimerResolution을 사용하십시오.

힌트 : 효과를 줄이려면 시스템 시간의 전환시 NtSetTimerResolution, timeBeginPeriod 및 timeEndPeriod를 호출하십시오. 이것은 호출에 앞서 시스템 시간 전환을 폴링하여 수행 할 수 있습니다.

... 초 정밀도의 마이크로 초까지 스톱워치 카운터가 추가되었습니다. 불행히도 Stopwatch은 시스템 시간 조정을 고려하지 않습니다. 당신은 실제 시스템 시간 조정 (GetSystemTimeAdjustment 쿼리 및 스톱워치 주파수에이 호출에 의해 얻은 이득을 적용해야 할 것

요약 :.이 더 ... 정밀/정확 (구별 할 수 있나요 . 여기에) 그것은 모두 의미 미세한 단위가 있습니다. 정밀 및 정확도를

참고 :. 여기에 설명 된 바와 같이 높은 주파수 하트 비트에서 시스템을 실행하는 방법에 대한 불만이있다 마이크로 소프트는 전력 소비로에 의해 제기 상태 많은 사람들이 고 빈도의 심장 박동으로 인해 잃어버린 메가 와트에 대해 씁니다. 평소처럼 더 많이 지불하면됩니다. 더 당신은 얻는다.

관련 문제