【问题标题】:Slow methods calls缓慢的方法调用
【发布时间】:2010-09-27 21:04:16
【问题描述】:

方法调用真的这么慢还是我的电脑有问题?

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 得到了类似的结果。

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

【问题讨论】:

    标签: .net performance


    【解决方案1】:

    你可能是:

    • 在调试模式下构建
    • 在调试器中运行。

    我的结果:

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

    【讨论】:

    • 乔恩,即使在调试模式下,我得到的结果也与你的非常相似。
    • 在调试器中运行,还是在调试模式下构建?
    • 不敢相信你正在使用 Vista
    • @Greg - 可以是 Server 2008(我首选的桌面操作系统)或 windows 7。
    • 不,是 Vista。我知道这样说并不“酷”,但实际上我更喜欢 Vista。
    【解决方案2】:

    1723 13 这是否更符合您的预期?

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

    编辑:

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

    编辑 2:

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

    【讨论】:

      【解决方案3】:

      不管是什么原因,这与方法调用无关。一方面,这样的方法调用是有效的。另一方面,您的第一个示例 调用了一个方法。第三,第二个方法调用 会被内联,因为那里什么都没有发生,所以第二个循环实际上是完全空的。编译器甚至可以优化掉整个循环。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-02
        • 1970-01-01
        • 2011-11-01
        • 1970-01-01
        相关资源
        最近更新 更多