2012-04-08 59 views
-2

如何,我試圖把這種如何調用委託

  double elapsed = 0; 

      for (int i = 0; i < 100000; i++) 
      { 


       elapsed+= (TestHelper.Timer(() => session.SaveTransaction(transaction))); 
      } 
      Debug.WriteLine(string.Format("avg execution time is {0} ms", elapsed/100000)); 

不編譯另一個類 我有以下代碼

public class Test 
{ 
    public static long Method1(Action a) 
    { 
     var s = Stopwatch.StartNew(); 
     a.Invoke(); 
     s.Stop(); 
     return s.Elapsed.TotalMilliseconds; 
    } 
} 

。通話代碼應該如何?

+5

這顯然不是你的* real *代碼,或者它不會編譯。這是毫秒,而不是毫秒,秒錶,而不是秒錶。 – 2012-04-08 19:54:28

+0

我更喜歡通過'a.Invoke()'調用'a()'。然而,同樣的事情:) – leppie 2012-04-08 19:57:50

+0

和我通常作爲一個最佳實踐不要複製粘貼我的代碼,我只是試圖描述這個問題。所以我真的沒有得到你的反對票。 – Elena 2012-04-08 20:01:19

回答

3

兩個問題:

  • 你測量單個調用;一般來說,您應該調用批次,否則它很可能太快(或至少在毫秒之內)。
  • 您使用的是TimeSpan.Milliseconds,當您實際上可能意味着TimeSpan.TotalMilliseconds;否則如果你已經過了一秒鐘,它仍然會報告一個介於0和999之間的值。
+0

它包含在for循環中,但我懶得複製粘貼,但如果我有對於(int i = 0; i <1000000; i ++){miliseconds = Test.Method1(委託{無論哪種方法需要測量})}它不編譯說double不包含TotalMiliseconds的擴展方法 – Elena 2012-04-08 19:58:24

+1

@Elena:No ,你循環內*方法,多次調用委託。否則,你只會添加很多次。這不會有幫助。與往常一樣,一個簡短但完整的程序展示真實問題是一個好主意。 – 2012-04-08 20:04:55

+0

也許我只是累了,但你「循環內的方法」是什麼意思?呃,明白了。好的,謝謝 – Elena 2012-04-08 20:13:39