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


Answers

마이크로 벤치 마크에 집중하는 대신 코드를 프로파일 링하지 않는 이유는 무엇입니까?

다음과 같은 좋은 오픈 소스 프로파일 러가 있습니다.

Question

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

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




정확성을 위해 단일 측정에 의존하지 마십시오.

몇 분 동안 각 코드 경로를 실행하고 반복 횟수를 계산하여 평균값을 얻습니다.







System.Diagnostics.Stopwatch 클래스는 경과 된 시간을 정확하게 측정하지만 ElapsedTicks 메서드가 작동하는 방식에 따라 일부 사람들은 코드에 실제로 논리 오류가있는 경우 정확하지 않다는 결론을 내리게됩니다.

일부 개발자는 스톱워치가 정확하지 않다고 생각하는 이유는 스톱워치의 ElapsedTicks가 DateTime의 틱과 같지 않기 때문입니다. 문제는 응용 프로그램 코드에서 ElapsedTicks를 사용하여 새 DateTime을 만들 때 발생합니다.

var watch = new Stopwatch();
watch.Start();
... (perform a set of operations)
watch.Stop();
var wrongDate = new DateTime(watch.ElapsedTicks); // This is the WRONG value.

필요한 경우 스톱워치 지속 시간을 다음과 같은 방법으로 DateTime으로 변환 할 수 있습니다.

// This converts stopwatch ticks into DateTime ticks.
// First convert to TimeSpan, then convert to DateTime
var rightDate = new DateTime(watch.Elapsed.Ticks); 

문제를 자세히 설명하는 기사는 다음과 같습니다. http://geekswithblogs.net/BlackRabbitCoder/archive/2012/01/12/c.net-little-pitfalls-stopwatch-ticks-are-not-timespan-ticks. aspx




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

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

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




MSDN에는 스톱워치의 몇 가지 예가 있습니다. 또한 나노초 내에 얼마나 정확한지를 보여줍니다. 희망이 도움이!




스톱워치 클래스는 설치된 하드웨어 및 운영 체제에 따라 주파수가 다른 구성에서 다른 값을 반환합니다.

스톱워치 클래스를 사용하면 실행 시간을 대략적으로 추정 할 수 있습니다. 각 실행마다 다른 값을 반환하므로 평균 실행 횟수를 다르게해야합니다.

추가 정보 : http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx




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




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

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