2009-10-24 1 views
1

나는 asp.net 페이지에 실행 시간을 측정하고자하는 코드가 들어 있습니다. 나는이 목적을 위해 아주 기본적인 도우미 클래스를 만들었습니다 ASP.NET 페이지의 시간 측정

public class Timing 
{ 
    private long m_ticksBefore; 
    private long m_ticksAfter; 

    public void Before() 
    { 
     m_ticksBefore = DateTime.Now.Ticks; 
    } 

    public void After() 
    { 
     m_ticksAfter = DateTime.Now.Ticks; 
    } 

    public void TraceTime(string note) 
    { 
     TimeSpan span = new TimeSpan(m_ticksAfter - m_ticksBefore); 
     System.Diagnostics.Trace.Write(string.Format("\n...Timing for {0}...\nTicks: \t{1}\nMilliseconds: \t{2}\nSeconds: \t{3}\n..................", note, span.Ticks, span.TotalMilliseconds, span.TotalSeconds)); 
    } 
} 

내가 새로운 타이밍 객체를 생성하고 난에 TraceTime() 메서드를 호출 마지막으로 전()와 및 방법 후 모니터링하고자하는 코드를 포장 결과를 IDE의 출력 창에 출력하십시오.

이상한 점은 페이지에 대한 첫 번째 요청이 약 40 밀리 초의 예상 타이밍 결과를 가져 오지만 페이지 (F5)를 새로 고치면 실행 시간이 0 tick입니다. 심지어 감시 지역 내에서 다른 코드의 실행을 강제 새로운 매개 변수를 사용하여 페이지를 실행하는 것은 내가 System.Diagnostics.StopWatch를 사용하는 경우가 평면은 0

대신 내가 훨씬 더 현실적인 결과

Stopwatch watch1 = Stopwatch.StartNew(); 
//Some code to monitor 
watch1.Stop(); 
System.Diagnostics.Trace.Write(watch1.ElapsedTicks); 

나에게 얻을 밝혀 ... 코드는 매우 비슷한 것 같다 나는 첫 번째 방법은 출력 현실적인 결과를 실패하는 이유를 찾을 수 없습니다

이 장면 뒤에 수행되는 최적화 문제의 일종 것 같다,하지만 난 정말하지 않습니다 그것을 얻으십시오. 아마도 개인적인 타이밍 문제, 즉 침대 시간 문제 때문일 수 있습니다 ...

답변

1

DateTime.Now는 100ns의 해상도로 표시되지만 Windows는 실제로는 15ms마다 내부 클록 만 업데이트합니다. 따라서 코드 실행에 약 7.5ms가 걸리면 평균적으로 DateTime.Now가 7.5ms 동안 기다려야하므로 변경할 시간이 전혀없는 것으로 보입니다.

더 정확한 타이밍이 필요한 경우, (찾은 것처럼) StopWatch를 사용할 수 있습니다. 이렇게하면보다 정확하고 다른 API를 사용하여 결과를 얻을 수 있습니다.

편집MSDN documentation for DateTime.Now의 해상도는 "약 10ms"입니다. GetTickCount API (동일한 시스템 타이머 사용)는 "일반적으로 10 밀리 초에서 16 밀리 초 범위"라는 해상도를 제공합니다.

분명히 하드웨어에 달려 있습니다. 단일 프로세서 시스템은 일반적으로 10ms이고 다중 프로세서 시스템은 일반적으로 15ms입니다.

+0

문제는 동일한 코딩이 한 상황에서 40ms, 다른 시나리오에서 0ms를 취하고 있다는 것입니다. 물론 측정중인 코드는 다시 게시 시나리오에서 다르게 반응 할 수 있지만 언급하지 않았습니다. –

+0

요점은 실제로 0ms가 아니라는 것입니다. 여전히 상당히 떨어지지 만 ~ 40ms ~ <10ms는 ~ 40ms ~ 0ms보다 훨씬 그럴듯합니다. – stevemegson

+0

그게 사실이야. –

0

나는 현재와 같은 문제가 발생하지 않습니다. ... 진드기

이 ... 이것에 대한 타이밍이 메모입니다 : 1,000,057 밀리 초

Timing timing = new Timing(); 
timing.Before(); 
for (int i = 0; i < 100; i++) 
    Thread.Sleep(1); 
timing.After(); 
// I altered TraceTime to receive a HttpResponse. 
timing.TraceTime("this is a note", this.Response); 

응답은 항상 가까이 : 나는 버튼 클릭 이벤트에 다음 코드를 넣어 : 100,0057 초 : 0,1000057 .................. 내가 새로 경우 게시물 다시 있다면 상관없이, ... 다시 게시하지

페이지 또는 아닙니다.

어떻게 Timing 클래스를 사용하고 있습니까?

편집

나는 또한 페이지로드 핸들러에 위의 코드를 넣고 동일한 결과를 얻었다. 그것이 포스트 백인지, 새로 고침인지 등은 중요하지 않습니다.

오류가 발생한 상황을 알려 주셔야합니다.

+0

예제에서와 완전히 똑같은 방법입니다. –

+0

코드는 예제와 같이 페이지로드 처리기에 정확하게 추가됩니다. 처음 디버그 모드에서 페이지를 쳤을 때 출력 창에 적절한 값이 표시됩니다. 페이지를 다시로드하면 (F5 또는 Ctrl + F5로) 0 틱을 얻습니다. 그것의 아주 이상한 ... –

+0

미안 해요, 열심히 노력했지만 재현 할 수 없습니다. –