Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么匿名方法在我的测试中更快?_C#_.net_Clr - Fatal编程技术网

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

C# 为什么匿名方法在我的测试中更快?,c#,.net,clr,C#,.net,Clr,我编写了两个简单的应用程序: 1.一个使用匿名方法,以及 2.一种是使用简单的方法 上述每个方法都在执行一个简单的操作: int add(int n1, int n2) {return n1+n2} 我调用了一个简单的for循环,它将调用add方法10000次。使用匿名方法的实现比其他方法花费的时间少得多。为什么?是因为抖动包含匿名方法吗 delegate int ADD( int i1, int i2 ); private void button1_Click( object sende

我编写了两个简单的应用程序: 1.一个使用匿名方法,以及 2.一种是使用简单的方法

上述每个方法都在执行一个简单的操作:

int add(int n1, int n2) {return n1+n2}
我调用了一个简单的for循环,它将调用add方法10000次。使用匿名方法的实现比其他方法花费的时间少得多。为什么?是因为抖动包含匿名方法吗

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;
    }
 }

我无法证实你的结果

在我的测试中,普通函数的性能比委托函数好大约一个数量级。下面是我用于测试的经过轻微修改的代码:

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);

    }

}
你一定是在做一些扭曲结果的事情

--编辑--

好的,我已经做了另一轮测试,这次是一个WinForms应用程序

当WinForms应用程序编译为“x86”时,结果与上面的控制台应用程序相同。函数比委托更快。 当WinForms被编译为“x64”时,函数的速度会急剧降低,大致达到委托的级别。 当函数被设置为静态时,它会在“x64”WinForms build中再次加速。 上面的控制台应用程序从不减速,即使是在“x64”版本中,甚至是在功能变为非静态时。
所有内容都是在版本配置中的调试器外部测量的。

只有1000次?任何现代计算机都能在不到一毫秒的时间内完成这项工作。另一方面,计算机中的时钟很难测量这么小的时间间隔。请张贴您的计时代码。这里没有足够的信息来回答这个问题。您是否处于发布或调试模式。我使用秒表进行控制台。写入循环运行的时间-在发布和调试时使用“匿名方法”比常规方法更费时。您是在Visual Studio内部还是外部运行?调试器将阻止JIT优化,甚至在版本配置中也会扭曲结果。另外,add是在接口中声明然后在类中实现,还是只是一个直接的类级方法?我知道JIP优化。。。我说的是发布模式,我不认为他歪曲了结果;我认为他看错了,认为最上面一行是代表的结果,最下面一行是方法的结果。不-请看我修复代码-然后再尝试运行它!“正常”代码运行较慢@这是WinForms还是console应用程序?winform-操作是通过按下按钮进行的@Gabe不,我已经确认了他的结果,请参见编辑。WinForms应用程序的“x64”版本中出现了一些奇怪的情况。
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