2012-03-14 3 views
5

하게 시험 할AverageTimer32 카운터 값 I는 다음과 같은 코드의 일부를 기록한 제로

내가있어서 ComputeAndLog 전화 및 성능 모니터 나 비 제로 평균 값을 볼 수있다. 그러나 테스트를 마자 마자 평균 성능 카운터 값이 0으로 떨어집니다. 그게 왜 그런 거지?

아마도 잘못된 카운터를 사용하고 있습니까?

필자가 가지고있는 요구 사항은 함수가 있고 평균적으로 함수가 완료되는 데 걸리는 시간을 평균적으로 계산해야한다는 것입니다. 뭔가 아래와 같이 :

void ComputeAndLog() 
{ 
    Stopwatch stopWatch = Stopwatch.StartNew(); 
    FunctionWhoseAveragetTimeIsToBeMeasured(); 
    write_counter(stopWatch.ElapsedTicks); 
} 

void write_counter(long timeForCompletion) 
{ 
    averageTimeCounter.IncrementBy(timeForCompletion); 
    averageBaseCounter.Increment(); 
} 

감사 여자가

+1

소크라테스 : 증가하지 않은 평균은 얼마입니까? –

+0

죄송합니다. 나는 그 질문을받지 못했습니다. 아마도 내가 잘못된 카운터를 사용하고 있습니까? 내가 가진 요구 사항으로 초기 코드를 업데이트했습니다. –

+0

마지막 측정 이후의 평균 지속 시간입니다. 로깅을하지 않으면 평균 지속 시간이 정의되지 않았으므로 (0으로 단순화 됨) 0이됩니다. – Guvante

답변

4

AverageTimer32/64 당신이 수행하는 모든 측정치의 평균을 계산하지 않습니다. 대신 측정 한 작업 수에 대한 측정 값을 제공합니다.

기본적으로 코드의 문제는 측정을 수행 할 때마다 새 타이머를 사용한다는 것입니다.

AverageTimer의 작동 방식을 이해하려면 해당 수식을 이해하는 것이 도움이 될 수 있습니다. 이것은 AverageTimer를 사용하기 위해 AverageBase가 필요한 이유에 대해서도 대답합니다. 1 - (AverageTimer)

((N1 - N0)/F)/(B1 - B0) 

시간 t (AverageTimer)에서

  • N1 현재 판독
  • N0 t에서, 이전 판독

    으로 :

    AverageTimer 공식은 다음과 같다

  • 현재 카운터가 t 일 때 (평균 기준)
  • 일 때 카운터가 t - 1 (Average Base)
  • F 인자는 진드기/초 요컨대

포뮬러 틱 현재 시간을 취하고 이전 감산을 산출한다. 결과를 인수 F로 나눈 값은 t-1에서 마지막으로 측정 한 이후의 작업 실행 시간을 나타냅니다.

이제 이것을 현재 카운터에서 카운터를 뺀 값으로 나눕니다. 이것은 대개 하나 일 수 있습니다. 결과적으로 하나의 측정에 대한 작업의 평균 시간이 확보됩니다.

이제 AverageBase를 사용하여 다양한 측정 포인트를 건너 뛸 수 있습니다. 카운터를 10 번째 작업마다 매번 설정할 수 있다고 생각하십시오. 마지막 측정 이후에 10 회의 모든 작업에 대해 AverageTimer를 새 시간 측정 값만큼 증가 시키지만 AverageBase는 10만큼 증가시킵니다. 결국, 한 번의 작업에 대한 평균 시간이 표시됩니다 (10 번의 작업 호출을 모두 측정 한 경우에도 마찬가지 임).

코드 예제를 보면 항상 타이머 시작부터 타이머 끝까지의 차이점을 보냅니다. AverageBase를 1 씩 증가시키면서 이것을 10, 9, 8, 7, 6과 같은 일련의 숫자로 보겠습니다.다음과 같은 결과가 나타납니다 알고있는 두 번째 측정을 위해

:

(9-10)를/F/(10) = -1/F F는 단순 1 인으로/1

결과가 -1이됩니다. 그러나 제출

올바른 값

40 다시 같은 예는 우리가 얻을

10, 19, 27, 34, 있어야

(19 - 10)/F/(1 - 0) = 9/F/1

다시 F를 1로 설정하면 조작에 소요되는 평균 시간은 9입니다. 알 수 있듯이 AverageTimer가 제대로 작동하려면 측정 된 다음 값이 이전 값보다 커야합니다.

예에서 글로벌 스톱워치를 사용할 수 있습니다. 새로운 것을 시작하는 대신 Restart()가 아닌 Start()를 사용하십시오. 위에 표시된 것처럼 카운터는 내부적으로 시간의 차이를 계산합니다. 그렇게하면 올바른 측정 값을 얻을 수 있습니다.

0으로가는 것도 의미가 있습니다. 테스트 나 프로그램이 끝나면 카운터가 닫히고 더 이상 값을 제공하지 않습니다. 카운터에서 Close() 메서드를 호출하여 수동으로 수행 할 수 있습니다.

+0

나는이 대답이 정확하다고 생각하지 않는다. 질문에서, N은 항상 경과 된 틱에 의해 * 증가됩니다. 따라서 N1이 N0보다 작을 수는 없습니다 (첫 번째 예와 같이). 따라서 남은 결론은 (아마도) 잘못된 것이다. –

0

비슷한 문제가있었습니다. 나는 PerformanceMonitor에서 AverangeCounter에 의해 좋은 결과를 얻었다. 하지만 프로그램에서 연산 NextValue는 항상 0을 반환합니다. 그런데 ElapsedTime 카운터에서 원하는 작업 반환 값과 같습니다.

그럼 AverageTimer32의 핵심을 이해합니다 (희망). AverageTimer32에서 평균 작업 시간을 표시하지 않기를 바랍니다. 한 번의 작업에 평균 시간이 걸리는 타이머 일뿐입니다. 작동 시간이없는 것보다 작업이 없으면 카운터의 값으로 0이됩니다.

내가 틱을 추가 할 때마다 틱을 추가 할 때마다 카운터가 초 단위로 반환됩니다 (평균값이 아닌 마지막 값을 반환하는 것으로 이해함). AverageTimer32 카운터에는 누구나 오해 할 수있는 이름이 있습니다. 그리고 캐시하면 더 읽기 쉬운 형식으로 변환하여 프로그램의 카운터 값으로 사용할 수 있습니다 (두 번째로 0을 받으면 바로 NextValue를 요청하면이 값을 프로그램의 값으로 사용할 수 있습니다).

또한 이전 답변을 수정하고 싶습니다. 당신은 사용해야

10, 9, 8, 7, 6

대신

10

, 19, 27, 34, 40

사용 방법 증가 및

10, 19, 27, 34, 40

RawValue에서 Stopwatch.GetTimestamp()를 수동으로 설정할 때.

관련 문제