[C#] 얼마나 정확하게 System.Diagnostics.Stopwatch입니까?



Answers

방금 스톱워치에서 높은 정확도 (0.1ms 이상)를 얻으려면 테스트 설정을 수행해야하는 방법을 설명하는 기사를 작성했습니다. 나는 모든 것을 설명해야한다고 생각합니다.

codeproject.com/KB/testing/stopwatch-measure-precise.aspx

Question

얼마나 정확하게 System.Diagnostics.Stopwatch 입니까? 다른 코드 경로에 대한 일부 메트릭을 수행하려고하는데 정확한 것으로 필요합니다. 스톱워치를 사용해야하는지, 아니면 더 정확한 다른 솔루션이 있어야합니다.

때때로 스톱워치가 잘못된 정보를 제공한다고 들었습니다.




첫째, 정확한 것은 물리적 또는 절대적으로 정확한 척도가 될 수 없으므로 시간이나 공간에 대해 말할 때 가능하거나 의미있는 개념이 아닙니다.

둘째, David Bolton 의 블로그 기사가 유용 할 수 있습니다. 나는 인용하고있다.

이 시간이 고해상도 카운터와 시간이 맞으면 마이크로 초 정도가 될 것입니다. 실제로는 나노초 (10-9 초, 즉 10 억 분의 1 초)로 정확하지만 나노초의 정확성은 그다지 중요하지 않은 다른 많은 것들이 있습니다. 코드의 타이밍 또는 벤치마킹을 수행 할 때 Windows에서 실행되는 다른 프로세스, 디스크로의 스왑이 얼마나 발생하는지 등 두 가지 실행 사이의 값이 다를 수 있으므로 실행 횟수와 평균 시간을 가져야합니다.




더 정확한 타이밍을 원한다면. QueryPerformanceCounter를 살펴보십시오. QueryPerformanceCounter 대한 MSDN 링크 깔끔한 구현은 here 에 주어집니다. 이 예제에서는 CE 용 coredll.dll을로드합니다. Windows의 경우 MSDN 설명서에 명시된대로 Kernel32.dll을로드해야합니다.




위의 HUAGHAGUAH의 권고를 뒷받침하는 것 외에도 일반적으로 마이크로 벤치 마크에 대해 회의적이어야한다고 덧붙였습니다. 집중 형 성능 테스트에는 합법적 인 장소가 있지만 중요하지 않은 세부 사항을 조정하는 것은 매우 쉽습니다. 따라서 가독성과 명료성을 위해 설계된 코드를 작성하고 검증 한 다음 핫 스팟이 어디에 있는지 (또는 걱정할 가치가 있는지) 알아 내고 프로파일 링하여 해당 부분 만 조정하십시오.

필자는 시스템이 사람의 입력을 기다리는 동안 실행 된 약간의 코드를 마이크로 최적화 된 프로그래머와 함께 일한 것을 상기합니다. 그 시간 단축은 키 스트로크 지연 사이에서 절대적으로 사라졌습니다!




Links