Development Tip

프로덕션 코드에서 스톱워치를 사용할 수 있습니까?

yourdevel 2020. 10. 24. 11:59
반응형

프로덕션 코드에서 스톱워치를 사용할 수 있습니까?


정확한 타이머가 필요하고 DateTime. 지금은 충분히 정확하지 않은 것 같습니다. 내가 읽은 설명에서 System.Diagnostics.Stopwatch는 정확히 내가 원하는 것 같습니다.

하지만 공포증이 있어요. 실제 프로덕션 코드에서 System.Diagnostics의 모든 것을 사용하는 것이 불안합니다. (저는 Asserts 및 PrintLns 등으로 디버깅하는 데 광범위하게 사용하지만 아직 프로덕션 작업에는 사용하지 않습니다.) 단순히 타이머를 사용하여 기능을 벤치마킹하는 것이 아닙니다. 앱에는 실제 타이머가 필요합니다. System.Diagnostics.StopWatch는 벤치마킹 전용이며 이유는 없지만 소매 코드에서 사용해서는 안된다는 다른 포럼을 읽었습니다. 이것이 맞습니까, 아니면 나 (그리고 그 조언을 게시 한 사람)이 System.Diagnostics에 대해 너무 폐쇄적으로 생각하고 있습니까? 즉, 프로덕션 코드에서 System.Diagnostics.Stopwatch를 사용해도 괜찮습니까? 감사합니다 Adrian


내부적으로 Stopwatch가하는 거의 모든 작업은 QueryPerformanceCounter를 감싸는 것 입니다. 내가 이해하는대로 스톱워치는 고해상도 타이머에 대한 액세스를 제공하기 위해 존재합니다. 프로덕션 코드에서이 해상도가 필요한 경우 사용하는 데 문제가있는 것은 아닙니다.


예, System.Diagnostics디버깅 전용 인 것처럼 들리지만 이름이 당신을 속이지 않도록하십시오. System.Diagnostics네임 스페이스는 처음 생산 코드에서 사용하기에 조금 무서운 소리를 (그것이 나를 위해 한) 보일 수 있지만, 네임 스페이스에 유용한 것들을 많이 있습니다.

Process클래스 와 같은 일부 항목 은 시스템과 상호 작용하는 데 유용합니다. Process.Start다른 응용 프로그램을 시작할 수 있습니다, 사용자에 대한 웹 사이트를 실행 파일이나 폴더 등을 열

Trace클래스 와 같은 다른 것들은 프로덕션 코드에서 버그를 추적하는 데 도움이 될 수 있습니다. 물론 프로덕션 코드에서 항상 사용하는 것은 아니지만 원격 시스템에서 찾기 어려운 버그를 기록하고 추적하는 데 매우 유용합니다.

이름에 대해 걱정하지 마십시오.


System.Diagnostics프로덕션 에서 수업을 사용하지 않기 위해 다른 포럼에서 읽었다 고 말합니다 . 그러나 걱정해야 할 유일한 소스는 코드를 만든 Microsoft입니다. 그들은 StopWatch수업을 말한다 :

경과 시간을 정확하게 측정하는 데 사용할 수있는 메서드 및 속성 집합을 제공합니다.

그들은 "생산을 제외하고"라고 말하지 않습니다.


Afaik StopWatch는 QueryPerformanceCounter 기능에 대한 쉘 입니다. 이 기능은 많은 성능 카운터 관련 측정의 기초입니다. QPF는 호출이 매우 빠르고 완벽하게 안전합니다. Diagnostics 네임 스페이스에 대한 편집증이 느껴진다면 QPF를 직접 호출하십시오.


스톱워치는 기본적으로 네이티브 QueryPerformanceCounterQueryPerformanceFrequency메서드를 둘러싼 깔끔한 래퍼 입니다. System.Diagnostic네임 스페이스 사용이 불편 하다면 직접 액세스 할 수 있습니다 .

성능 카운터를 사용하는 것은 매우 일반적이며 잘못된 것은 없습니다. AFAIK, 더 높은 타이머 정밀도를 사용할 수 없습니다. QPF로 인해 다중 프로세서 시스템에서 문제가 발생할있지만 이전에 링크 된 MSDN 문서에서 이에 대한 추가 정보를 제공합니다. System.Diagnostics.Stopwatch백그라운드에서 확인 하거나를 SetThreadAffinity수동으로 호출하는 것이 좋습니다. 그렇지 않으면 타이머가 시간을 거슬러 올라갈 수 있습니다 !

매우 고정밀 측정의 경우 고려해야 할 몇 가지 미묘한 점이 있습니다. 이 정도의 정밀도가 필요한 경우 이러한 문제가 발생할 수 있습니다.


.NET 기본 클래스 라이브러리에는 여러 가지 타이머 클래스가 있습니다. 사용자의 요구에 가장 적합한 것은 사용자 만 결정할 수 있습니다.

다음은 주제에 대한 MSDN 매거진의 좋은 기사입니다 (.NET Framework 클래스 라이브러리의 Timer 클래스 비교).


타이머를 사용하는 용도에 따라 고려해야 할 다른 문제가있을 수 있습니다. Windows는 실행 타이밍에 대한 보증을 제공하지 않으므로 실시간 처리에 의존해서는 안됩니다 (하드 실시간 예약을 제공하는 Windows에 대해 얻을 수있는 실시간 확장이 있습니다). 또한 시간 간격을 캡처 한 후 정밀도에 의존하는 작업을 수행하기 전에 컨텍스트 전환의 결과로 정밀도를 잃을 수 있다고 생각합니다. 원칙적으로 이것은 임의적으로 긴 시간이 될 수 있습니다. 실제로는 밀리 초 정도 여야합니다. 이 타이밍이 얼마나 중요한지에 달려 있습니다.

참고 URL : https://stackoverflow.com/questions/2805362/can-stopwatch-be-used-in-production-code

반응형