2015-11-15 66 views
-1

這是我第一次嘗試使用秒錶來衡量代碼的性能,我不知道什麼是錯的。我想檢查是否有差異時投擲加倍以整數計算平均值。秒錶給出隨機結果

public static double Avarage(int a, int b) 
    { 
     return (a + b + 0.0)/2; 
    } 

    public static double AvarageDouble(int s, int d) 
    { 
     return (double)(s + d)/2; 
    } 

    public static double AvarageDouble2(int x, int v) 
    { 
     return ((double)x + v)/2; 
    } 

代碼以測試這些3種方法,使用秒錶:

 Stopwatch sw = new Stopwatch(); 

     sw.Start(); 
     for (int i = 0; i < 1000000; i++) 
     { 
      var ret = Avarage(2, 3); 
     } 
     sw.Stop(); 

     Console.Write("Using 0.0: " + sw.ElapsedTicks + "\n"); 
     sw.Reset(); 
     sw.Start(); 
     for (int i = 0; i < 1000000; i++) 
     { 
      var ret2 = AvarageDouble(2, 3); 
     } 
     sw.Stop(); 
     Console.Write("Using Double(s+d): " + sw.ElapsedTicks + "\n"); 
     sw.Reset(); 
     sw.Start(); 
     for (int i = 0; i < 1000000; i++) 
     { 
      var ret3 = AvarageDouble2(2, 3); 
     } 
     sw.Stop(); 
     Console.Write("Using double (x): " + sw.ElapsedTicks + "\n"); 

它顯示隨機結果,一旦平均是fastets,其他時間AverageDouble或AverageDouble2。我使用差異變量名稱,但看起來沒有關係。

我錯過了什麼?

PS。以兩個整數作爲輸入計算平均值的最佳方法是什麼?

+0

你是什麼意思*隨機*結果?這對我來說是按預期工作的 –

+0

沒有區別,所有這三個版本都要求處理器執行完全相同的機器代碼指令。你看到的是處理器不確定地執行代碼。在多任務操作系統上運行它是非常重要的一部分,你的程序不是唯一運行的代碼。但是它低到處理器本身的程度,例如它受到處理器確切位置的影響內存中的代碼和緩存的狀態。 –

回答

2

測試過你的代碼,是的,結果是有時非常隨機。請記住Stopwatch只是從sw.start()sw.stop()所用的時間。它沒有考慮到.Net的Just In Time編譯,操作系統進程調度,cpu負載等。

這將在使用如此小的運行時的方法中更加值得注意。在這些噪聲的情況下,可以使運行時間增加一倍。

在下面的SO問題Calculate the execution time of a method中編寫了一個詳細和更好的解釋。看看那裏。