2013-10-25 25 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毫秒。 N = 1000000以上。

但是,我將這個方法重寫爲兩個方法:mainCalc,至少應包含其他方法,f.e。 以獲得uid,id,名字等的平均時間。

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!

這是錯誤的結果或不?我不明白 - 使用stopWatch的方式是正確的?

P.S.刪除多餘的StopWatch之一。

P.P.S.感謝你們所有人!

+2

你是不是開始秒錶在這些方法之一。(提示:中間的一個)。 –

+0

我不太明白你的觀點,但是如果你想讓它顯示每次操作的時間,你應該重新啓動或重新設置秒錶。 –

+1

@SimonWhitehead:他正在使用'calcAverageTimeUid2'中的秒錶並返回結果。 MainCalc正在總結總時間。 – mao47

回答

1

Milliseconds不是TotalMilliseconds

毫秒是TimeSpan毫秒數的整數。不是總的毫秒數是雙倍的,所以你在1ms以內失去了精度。

爲什麼你要退回int而不是TimeSpan

試試這個代碼:

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的構造函數需要Ticks而不是毫秒,我已經做了編輯。 –

2

你的第一個程序應該是

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毫秒。

在第二種方法中,您每次啓動並停止一個新的秒錶,並返回毫秒。由於每個操作均1000000分之500= 0.00005毫秒,秒錶的蜱會積累一些小的價值,但ElapsedMilliseconds(或時間跨度的Milliseconds)仍然將是0

編輯:爲了解決你的問題,一旦循環完成,第一個循環應使用秒錶的最終Elapsed值(如sgmoore答案中的第二個示例)。第二種方法應該返回方法中的滴答而不是毫秒,然後根據秒錶的滴答頻率計算毫秒。

總之,第一個操作是總結一堆數值(如0.00005),第二個操作是對一堆0進行求和。