2012-04-08 62 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