慢速方法调用

时间:2008-12-20 21:03:15

标签: .net performance

方法调用真的很慢或者我的电脑出了什么问题吗?

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毫秒(Celeron D 2.53 Ghz 512 MB RAM Windows XP SP3 .NET 3.5)。 这是一个命令行项目。我在VB.Net上得到了类似的结果。

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

3 个答案:

答案 0 :(得分: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-,当从命令行运行时,我得到的结果也比原始结果好得多,这表明 在调试器中运行。性能测试不是一个好主意:))

答案 1 :(得分:4)

  1723 13这更像你的期望吗?

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

编辑:

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

编辑2:

分析器可以选择“自动附加并开始分析新进程”,默认情况下启用它。当探查器关闭时,它应该停止分析,并且确实在我的虚拟机测试中,但由于某种原因,一旦它没有并开始在后台分析每个.net进程(系统,ASP和Microsoft命名空间被排除在外默认,所以它不会影响Math.Pow太多了。)

答案 2 :(得分:1)

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

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