2013-10-25 7 views
0

작업 사이의 시간을 계산하려고합니다. 따라서 동일한 코드로 두 가지 메소드를 작성하되 다른 방법을 사용하십시오. 첫 번째 방법에서 내가 그렇게 할 :StopWatch 및 0 밀리 초 단위로 C#

private static void calcAverageTimeUid(ISomeObject someObj, int N,ISnapshot _Snapshot) 
    { 
     Stopwatch stopWatch = new Stopwatch(); 
     int averageTime = 0; 
     var uid = someObj.Uid; 

     for (int i = 0; i < N; i++) 
     { 
      stopWatch.Start(); 
      var coll = _Snapshot.GetObject(uid); 
      stopWatch.Stop(); 
      TimeSpan ts = stopWatch.Elapsed; 
      averageTime = averageTime + ts.Milliseconds; 
     } 
     averageTime = averageTime/N; 

    } 

그리고 난 500 밀리 초 averageTime 등을 초래할 수 있습니다. N = 1000000 이상.

하지만이 방법을 mainCalc라는 두 가지 방법으로 다시 작성합니다. 다른 방법을 포함해야합니다. f. 을 사용하면 uid, id, name 등의 평균 시간을 알 수 있습니다.

mainCalc :

private static void mainCalc(ISomeObject someObj,int N,ISnapshot _Snapshot) 
    { 

     int averageTimeUID = 0; 
     for (int i = 0; i < N; i++) 
     { 
      var tmp=calcAverageTimeUid2(someObj,N,_Snapshot); 
      averageTimeUID+=tmp; 
     } 
     averageTimeUID = averageTimeUID/N; 
    } 

그리고 다른 방법

private static int calcAverageTimeUid2(ISomeObject someObj,int N,ISnapshot _Snapshot) 
    { 
     Stopwatch stopWatch = new Stopwatch(); 
     var prop = someObj.Uid; 
     stopWatch.Start(); 
     var obj = _Snapshot.GetObject(prop); 
     stopWatch.Stop(); 
     TimeSpan ts = stopWatch.Elapsed; 
     return ts.Milliseconds; 
    } 

그래서, 내가 mainCalc을 실행하고 스톱워치 = 0 밀리이 method.And 결과에 calcAcerageTimeUid2을 실행!

잘못된 결과인가요? 나는 이해하지 못한다 - 무슨 방법으로 사용합니까?

P. 초과 스톱워치 중 하나를 삭제하십시오.

P.P.S. 여러분 모두에게 감사드립니다!

+2

당신은 그 방법 중 하나에 스톱워치를 시작하지 않습니다 .. (힌트 : 중간 일). –

+0

나는 당신의 요점을 이해하지 못하지만, 각 작업의 시간을 나타내려면 스톱워치를 다시 시작하거나 재설정해야합니다. –

+1

@SimonWhitehead : 그는'calcAverageTimeUid2'에 스톱워치를 사용하고 결과를 반환합니다. MainCalc가 총 시간을 합산합니다. – mao47

답변

1

MillisecondsTotalMilliseconds이 아닙니다.

밀리 초는의 입니다. TimeSpan의 밀리 초입니다. 총 밀리 초가 두 배가 아니기 때문에 1ms 미만의 정밀도를 잃어 버리게됩니다.

TimeSpan 대신 int을 돌려 주나요?

이 코드를보십시오 :

private static void mainCalc(ISomeObject someObj, int N, ISnapshot _Snapshot) 
{ 
    var averageTimeUID = TimeSpan.Zero; 
    for (int i = 0; i < N; i++) 
    { 
     averageTimeUID += calcAverageTimeUid2(someObj,N,_Snapshot); 
    } 
    averageTimeUID = new TimeSpan(averageTimeUID.Ticks/N); 
} 

다른 방법 :

private static TimeSpan calcAverageTimeUid2(ISomeObject someObj, int N, ISnapshot _Snapshot) 
{ 
    var stopWatch = new Stopwatch(); 
    var prop = someObj.Uid; 
    stopWatch.Start(); 
    var obj = _Snapshot.GetObject(prop); 
    stopWatch.Stop(); 
    return stopWatch.Elapsed; 
} 
+0

아마도 averageTimeUID = new TimeSpan (averageTimeUID.Ticks/N); ? – user2545071

+0

@ user2545071 : 맞습니다. TimeSpan의 생성자는 밀리 초가 아닌 틱을 취합니다. 편집했습니다. –

2

첫 번째 루틴은 다시 0으로 스톱워치를 재설정

for (int i = 0; i < N; i++) 
    { 
     stopWatch.Start(); 
     var coll = _Snapshot.GetObject(uid); 
     stopWatch.Stop(); 
    } 
    averageTime = stopWatch.Elapsed/N; 

주, stopWatch.Start()하지 하지해야한다.

+0

첫 번째 연산은 밀리 초 미만이므로 의미있는 결과를 얻지 못합니다. 두 번째는 견고합니다. – mao47

+0

@ mao47 : 정확합니다. 첫 번째 루틴을 삭제하겠습니다. – sgmoore

1

다른 결과가 나타나는 이유는 다른 위치에서 밀리 초를 반올림하기 때문입니다. 첫 번째 방법에서는 스톱워치를 하나만 사용하고 계속해서 Start()Stop()을 사용합니다. 작업 시간은 1 밀리 초 미만이어야하지만 같은 스톱워치를 반복적으로 시작하고 중지하면 틱 수는 계속 증가합니다. 그래서 N = 1000000으로 500 밀리 초 밖에 얻지 못합니다.

두 번째 방법에서는 매번 새 스톱워치를 시작 및 중지하고 밀리 초를 반환합니다. 각 작업은 1,000,000분의 500 = 0.00005 밀리 평균되기 때문에, 스톱워치의 진드기는 몇 가지 작은 값을 축적하지만, ElapsedMilliseconds (또는 시간 범위의 Milliseconds)는 여전히 0

편집 될 것입니다 : 당신의 문제를 해결하기 위해, 루프가 완료되면 첫 번째 루프는 스톱워치의 최종 Elapsed 값을 사용해야합니다 (예 : sgmoore의 답변에서 두 번째 예와 같이). 두 번째 메서드는 밀리 초가 아닌 메서드에서 틱을 반환 한 다음 스톱워치의 틱 주파수에서 밀리 초를 계산해야합니다.

요약하면, 첫 번째 연산에서는 0.00005와 같은 값을 합산하고 두 번째 연산에서는 0을 합산합니다.