2008-12-20 54 views
0

方法调用是否真的很慢,或者我的电脑有问题吗?慢速方法调用

static void Main(string[] args) { 
    Stopwatch sw = new Stopwatch(); sw.Start(); 
    for (int i = 0; i < 10000000; i++) { 
     double z = Math.Pow(i,2); 
    } 
    Console.WriteLine(sw.ElapsedMilliseconds); 
    sw = Stopwatch.StartNew(); 
    for (int i = 0; i < 10000000; i++) { 
     Noop(); 
    } 
    Console.WriteLine(sw.ElapsedMilliseconds); 
} 

static void Noop() { } 

第一环路需要1600至1700年毫秒,而第二环路需要3100 - 3200毫秒在我的系统(赛扬d 2.53 GHz的512 MB RAM的Windows XP SP3 .NET 3.5)。 这是一个命令行项目。我用VB.Net得到了类似的结果。

编辑:我想我找到了答案。

回答

4

1723 13这是否更像您所期望的?

是的,这就是我所期望的。我没有在调试模式下运行(调试模式给我1900/3200)。在IDE打开或关闭的情况下运行它,我会得到相同的结果。使用csc或使用ngen install不会改变结果。 我想我应该重新安装.net框架。

编辑:

感谢您的答案。
重新安装框架并未解决问题。在用虚拟机测试后,我得到了有意义的结果。我终于发现问题:
前段时间我安装了一个名为ProfileSharp的探查器。我不知道在没有我的授权的情况下Profiler在做什么(或为什么),但从我卸载它的那一刻起,我得到了第二个循环的6 ms。 我仍然需要重新安装它并做一些测试,看看它是否是罪魁祸首。

编辑2:

探查有一个选项设置为“自动连接并开始分析新工艺”,它的默认情况下启用。当分析器关闭时,它应该停止分析,并且确实在我的虚拟机测试中完成,但由于某种原因,一旦它没有并开始分析每个分析器。(系统,ASP和Microsoft命名空间默认排除在外,因此它不会影响Math.Pow太多)。

5

机会是您:

  • 内置调试模式
  • 冉在调试器。

我的结果:

c:\Users\Jon\Test>csc /o+ /debug- Test.cs 
Microsoft (R) Visual C# 2008 Compiler version 3.5.30729.1 
for Microsoft (R) .NET Framework version 3.5 
Copyright (C) Microsoft Corporation. All rights reserved. 


c:\Users\Jon\Test>test 
1723 
13 

是不是更喜欢你期望什么呢?即使使用/debug+ /o-,从命令行运行时,我的结果比原来的要好得多,这表明您在调试器中运行的。不是性能测试的好主意:)

+0

乔恩,即使在调试模式,我得到一个非常类似于你的结果。 – 2008-12-20 21:09:05

+0

在调试器中运行,还是只在调试模式下建立? – 2008-12-20 21:10:49

1

无论什么原因,这与方法调用无关。一方面,这种方法调用是有效的。另外,你的第一个例子调用一个方法。第三,第二个方法调用内联,因为没有任何反应,第二个循环实际上将完全是空的。编译器甚至可以优化整个循环。

最后,我无法在调试和发布模式下重现您的结果。