2010-05-10 9 views
64

정확한 타이머가 필요하며 DateTime.Now가 정확하지 않습니다. 내가 읽은 설명에서 System.Diagnostics.Stopwatch는 내가 원하는 것일 것 같습니다.스톱워치를 프로덕션 코드에서 사용할 수 있습니까?

하지만 나는 공포증이 있습니다. 실제 생산 코드에서 System.Diagnostics의 것을 사용하는 것에 대해 불안합니다. (나는 Asserts와 PrintLns 등으로 디버깅을 위해 광범위하게 사용하지만 프로덕션 작업에는 결코 사용하지 않습니다.) 저는 단순히 타이머를 사용하여 내 기능을 벤치 마크하려고하지 않았습니다. 내 앱에는 실제 타이머가 필요합니다. 다른 포럼에서 System.Diagnostics.StopWatch는 벤치마킹 전용이며 소매 코드에서는 사용해서는 안되는 것으로 보았습니다. 이유는 없었습니다. 이게 맞습니까? 아니면 제가 조언을 게시 한 사람이 System.Diagnostics에 대해 너무 신경 쓰지 않았습니까? 즉, 프로덕션 코드에서 System.Diagnostics.Stopwatch를 사용해도 괜찮습니까? 감사합니다 애드리안

+0

어떤 유형의 타이머가 필요합니까? 약간의 시간이 경과 한 후에 어떤 메소드가 호출되기를 원하십니까, 아니면 지금까지 얼마나 많은 시간이 경과했는지 알 필요가 있습니까? 어떤 정밀도가 필요합니까? – mnemosyn

+1

가능한 [C#에서 실시간 시계를 얻는 방법] 가능한 복제본? (http://stackoverflow.com/questions/2800559/how-to-get-a-real-time-clock-in-c). 나는 이것이 다른 질문과 어떻게 다른지 보지 못한다. 어쩌면 만약 당신이 그것을 "프로덕션 환경에서 System.Diagnostics 클래스를 사용하는 데 문제가 없지만 이제는 중복되었습니다."라고 바꾸면됩니다. –

+1

@ 존 - IMO, 확실히 중복이 아닙니다. 다른 질문은 어떻게하는지 묻습니다. 이 질문은 그것을 할 수 있는지 여부를 묻습니다. 다른 OP는 스톱워치를 피할 수있는 이상한 이유가있을 수 있습니다. (예를 들어 아직 감각이없는 정신없는 기업 BS 규칙은 계속 따라야합니다. 아니요, 씁쓸하지는 않습니다!) – dss539

답변

51

스톱워치의 거의 모든 스톱워치는 랩 QueryPerformanceCounter입니다. 내가 이해하는 한, Stopwatch는 고해상도 타이머에 대한 액세스를 제공합니다. 프로덕션 코드에서이 해상도가 필요한 경우 사용하는 데는 문제가 없습니다.

+2

We 생산 코드에서 항상 QueryPerformanceCounter를 사용하십시오. 이 인프라를 사용하는 것이 합리적입니다. –

4

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

+7

확장에 의해, 당신이'int'에 대한 편집증을 느낀다면 ... – Gusdor

3

스톱워치는 QueryPerformanceCounterQueryPerformanceFrequency 주변의 basically a neat wrapper입니다. System.Diagnostic 네임 스페이스를 사용하기가 쉽지 않다면 access these directly을 사용할 수 있습니다.

성능 카운터를 사용하는 것이 일반적이므로 그다지 잘못은 없습니다. AFAIK, 더 높은 타이머 정밀도가 없습니다. 다중 프로세서 컴퓨터에서 QPF로 인해 문제가 발생할 수 있지만 이전에 연결된 MSDN 기사는 이에 대한 몇 가지 추가 정보를 제공합니다. System.Diagnostics.Stopwatch을 백그라운드에서 실행하거나 SetThreadAffinity을 수동으로 호출하는 것이 좋습니다. 그렇지 않으면 타이머가 시간으로 뒤로 이동합니다.!

매우 정밀도가 높은 측정의 경우, 고려해야 할 some subtleties이 있습니다. 이 정도의 정밀도가 필요하다면 약간의 문제가있을 수 있습니다.

5

당신은 당신이 생산 System.Diagnostics에서 클래스를 사용하지 않는 다른 포럼에 읽은 말한다. 그러나 걱정할 필요가있는 유일한 소스는 코드 작성자 인 Microsoft입니다. 그들은 다음과 같이 말하고 있습니다. StopWatch class :

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

"생산을 제외하고"는 말하지 않습니다.

+5

그 의미가 비싸다고 생각합니다. – Tim

0

타이머를 사용하는 대상에 따라 고려해야 할 다른 문제가있을 수 있습니다. Windows는 실행 타이밍을 보장하지 않으므로 실시간 처리 (실시간 실시간 스케줄링을 제공하는 Windows 용 실시간 확장이 있음)에 의존해서는 안됩니다.또한 시간 간격을 캡처 한 후 컨텍스트 전환의 결과로 정밀도를 잃을 수도 있고 정밀도에 의존하는 작업을 수행하기 전에 정밀도를 잃을 수도 있습니다. 원칙적으로 이것은 임의로 긴 시간 일 수 있습니다. 실제로는 밀리 초 정도이어야합니다. 이시기가 미션 크리티컬한지 여부에 달려 있습니다.

21

예, System.Diagnostics은 디버깅 전용 인 것처럼 들리지만 이름을 속이지 마십시오. System.Diagnostics 네임 스페이스는 처음에는 프로덕션 코드에서 사용하기에는 약간 무서운 것처럼 보일 수 있지만 그 네임 스페이스에는 많은 유용한 것들이 있습니다.

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

기타 Trace 클래스는 제품 코드의 버그를 추적하는 데 도움이됩니다. 물론, 제품 코드에서 항상 사용하지는 않을 것이지만, 매우은 원격 컴퓨터에서 탐지하기 어려운 버그를 로깅하고 추적하는 데 유용합니다.

이름에 대해 걱정할 필요가 없습니다.

관련 문제