为什么匿名方法在我的测试中更快?

时间:2012-02-26 05:15:00

标签: c# .net clr

我写了两个简单的应用程序:      1.一个使用匿名方法,和      2.一个人用简单的方法。

上述每种方法都在做一个简单的操作:

int add(int n1, int n2) {return n1+n2}

我调用一个简单的for循环,将add方法调用10,000次。使用匿名方法的实现比其他方法花费的时间少得多。为什么?是因为JITter内联匿名方法吗?

delegate int ADD( int i1, int i2 );

private  void button1_Click( object sender, EventArgs e )
    {
        Stopwatch watch = new Stopwatch();
        watch.Reset();

        watch.Start();

        for( int i = 0 ; i < 10000 ; i++ )
        {
            add( i, i );
        }

        watch.Stop();
        Console.WriteLine("Normal Call " + watch.ElapsedTicks);

        watch.Reset();
        watch.Start();
        for( int i = 0 ; i < 10000 ; i++ )
        {
            ADD p = delegate( int n1, int n2 )
            {
                return n1 + n2;
            };

            p.Invoke( i, i );
        }

        watch.Stop();
        Console.WriteLine( watch.ElapsedTicks );

        Console.ReadLine();


    } 

    int add(int n1, int n2)
    {
        return n1 + n2;
    }
 }

结果 - 在发布模式下 - 在x64上编译(按动作按钮几次):

Normal 1525
1275
Normal 480
477
Normal 371
370
Normal 372
371
Normal 477
479
Normal 477
477
Normal 564
702
Normal 478
476

1 个答案:

答案 0 :(得分:2)

我无法确认您的结果。

在我的测试中,“普通”功能比委托更好地执行大约数量级。以下是我用于测试的略微修改的代码:

class Program {

    delegate int ADD(int i1, int i2);

    static int add(int n1, int n2) {
        return n1 + n2;
    }

    static void Main(string[] args) {

        Stopwatch watch = new Stopwatch();

        watch.Start();

        const int count = 100000;

        for (int i = 0; i < count; i++) {
            add(i, i);
        }

        watch.Stop();
        Console.WriteLine(watch.ElapsedTicks);

        ADD p = delegate(int n1, int n2) {
            return n1 + n2;
        };

        watch.Reset();
        watch.Start();
        for (int i = 0; i < count; i++) {
            p.Invoke(i, i);
        }

        watch.Stop();
        Console.WriteLine(watch.ElapsedTicks);

    }

}

打印:

103
1321

你必须做一些扭曲结果的事情。

---编辑---

好的我已经进行了另一轮测试,这次使用的是WinForms应用程序。

  • 当WinForms应用程序编译为'x86'时,结果与上面的控制台应用程序相同(函数比委托更快)。
  • 当WinForms编译为'x64'时,该函数会大幅减慢,大致达到代理级别。
  • 当函数static时,它再次加速(在'x64'WinForms构建中)。
  • 上面的控制台应用程序永远不会减速,即使在'x64'版本中也是如此,即使功能是非静态的。

在Release配置中,所有内容都在调试器外部进行了测量。