为什么.NET 2.0比4.0更快?

4
我想测试我的计算机性能,所以我运行了这段代码。
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        DateTime dt = DateTime.Now;
        Int64 i = 0;
        do
        {
            i++;
        } while (dt.AddSeconds(10) >= DateTime.Now);

        this.textBox1.Text = i.ToString("n0");
    }


}

当我选择 .NET Framework 2.0时,我得到了 3300 万的结果,但当我选择 4.0时,我只得到了 900 万的结果。

10
它们都是“发布”模式(不是调试模式),在集成开发环境之外执行吗?除非是这样,否则任何比较都没有意义。它甚至可能只是Intellitrace在调试器中记录事物。 - Marc Gravell
1
你连续运行了几次吗?请记住,当您切换目标版本时,它必须重新编译为MSIL,然后JIT编译为机器代码。当您切换版本时,请至少运行一次以完成MSIL和JIT编译,然后再运行它并使用那些数字。 - David
当你在64位机器上运行时(在VS2010中默认),你的构建是否设置为“x86”?不同的JIT会以不同的方式优化循环。尝试将构建设置为“Any CPU”。 - jornak
1
投票关闭。问题中没有足够的信息来给出一个明确的答案。正如所有评论所显示的那样,有许多需要被排除的变量,才能使这个问题成为一个可回答的问题。我建议,在使用这里的评论过滤掉所有其他可能的原因之后,它可能是可回答的,但就目前而言,它正在产生许多问题和需要消除的事情,但没有明确的答案在视野中。 - David
1
最后一条评论,然后我就闭嘴了。如果你想测量性能,MSDN文档上关于DateTime.Now的说明是这样的:Now属性经常用于测量性能。但是,由于其低分辨率,它不适合用作基准测试工具。更好的选择是使用Stopwatch类。 - David
显示剩余5条评论
1个回答

1

这不是一个答案,但对于评论来说太长了...问题的代码似乎确实源于.NET 2和4之间性能差异。具体来说,我发现在.NET 4中,DateTime.Now比2.0慢得多。

下面是测试控制台应用程序的输出(经过多次尝试),在.NET 2上为约300、310毫秒,在.NET 4上为1050、1090毫秒。

发布代码以便其他人可以在其他平台、配置上尝试。我在Windows 7-64位上编译发布模式。

using System;
using System.Diagnostics;
class Program
{
    public static void Main(string[] args)
    {
        const int m = 1000000;
        DateTime d;

        Stopwatch s1 = Stopwatch.StartNew();
        for (int i = 0; i < m; i++)
        {
            d=DateTime.Now;
        }
        s1.Stop();

        Stopwatch s2 = Stopwatch.StartNew();
        for (int i = 0; i < m; i++)
        {
            DateTime.Now.AddSeconds(10);
        }
        s2.Stop();

        Console.WriteLine("{0}, {1}",s1.ElapsedMilliseconds,s2.ElapsedMilliseconds);
        Console.Read();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接