C# 操作比方法调用快?

C# 操作比方法调用快?,c#,.net,delegates,C#,.net,Delegates,不久前,我确实发现了一篇关于动作比纯方法调用更快的文章。我不记得在哪里,但在那一刻,我被震惊了,做了一些测试,在某些情况下发现它是正确的 今天有人说我测试的是错误的,那么,有人能找到一个原因,在这些测试中,没有参数的动作比纯方法快吗?我必须说,它只在x64机器上更快,在x86机器上更慢 class Program { static void Main(string[] args) { test t = new test(); t.doTest();

不久前,我确实发现了一篇关于动作比纯方法调用更快的文章。我不记得在哪里,但在那一刻,我被震惊了,做了一些测试,在某些情况下发现它是正确的

今天有人说我测试的是错误的,那么,有人能找到一个原因,在这些测试中,没有参数的动作比纯方法快吗?我必须说,它只在x64机器上更快,在x86机器上更慢

class Program
{
    static void Main(string[] args)
    {
        test t = new test();
        t.doTest();
        Console.ReadKey();

    }
}

class test
{
    Stopwatch w;
    int a = 0;

    public void doTest()
    {
        Action doSum = () => { a = a + 1; };
        Action<int> doSumValue = (add) => { a = a + add; };

        w = new Stopwatch();

       Console.WriteLine("-------With params-------");
        for (int round = 0; round < 10; round++)
        {

            a = 0;
            w.Reset();
            w.Start();

            for (int buc = 0; buc < 500000000; buc++)
                sumValue(1);

            w.Stop();
            Console.WriteLine("Function: " + w.ElapsedMilliseconds);

            a = 0;
            w.Reset();
            w.Start();

            for (int buc = 0; buc < 500000000; buc++)
                doSumValue(1);

            w.Stop();
            Console.WriteLine("Action: " + w.ElapsedMilliseconds);



        }

       Console.WriteLine("-------With no params---------");
        for (int round = 0; round < 10; round++)
        {

            a = 0;
            w.Reset();
            w.Start();

            for (int buc = 0; buc < 500000000; buc++)
                sum();

            w.Stop();
            Console.WriteLine("Function: " + w.ElapsedMilliseconds);

            a = 0;
            w.Reset();
            w.Start();

            for (int buc = 0; buc < 500000000; buc++)
                doSum();

            w.Stop();
            Console.WriteLine("Action: " + w.ElapsedMilliseconds);

        }
    }

    void sum()
    {
        a = a + 1;
    }

    void sumValue(int toAdd)
    {
        a = a + toAdd;
    }

}
类程序
{
静态void Main(字符串[]参数)
{
测试t=新测试();
t、 doTest();
Console.ReadKey();
}
}
课堂测试
{
秒表w;
int a=0;
公共空间doTest()
{
动作doSum=()=>{a=a+1;};
动作doSumValue=(add)=>{a=a+add;};
w=新秒表();
Console.WriteLine(“----带参数-------”);
用于(整数舍入=0;舍入<10;舍入++)
{
a=0;
w、 重置();
w、 Start();
对于(int-buc=0;buc<500000000;buc++)
sumValue(1);
w、 停止();
Console.WriteLine(“函数:+w.ElapsedMilliseconds”);
a=0;
w、 重置();
w、 Start();
对于(int-buc=0;buc<500000000;buc++)
剂量值(1);
w、 停止();
Console.WriteLine(“操作:+w.ElapsedMilliseconds”);
}
Console.WriteLine(“----不带参数---------”);
用于(整数舍入=0;舍入<10;舍入++)
{
a=0;
w、 重置();
w、 Start();
对于(int-buc=0;buc<500000000;buc++)
sum();
w、 停止();
Console.WriteLine(“函数:+w.ElapsedMilliseconds”);
a=0;
w、 重置();
w、 Start();
对于(int-buc=0;buc<500000000;buc++)
doSum();
w、 停止();
Console.WriteLine(“操作:+w.ElapsedMilliseconds”);
}
}
无效金额()
{
a=a+1;
}
无效总和值(int到add)
{
a=a+toAdd;
}
}
编辑:将循环计数更改为超过1秒,结果相同

我的机器(i7 2600)上的结果如下:

大量迭代的新结果

-x86 *与params

功能:1417ms 动作:1568ms

*无参数

功能:1422ms 动作:1634ms

-x64 *与params

功能:1976ms 动作:2114ms

*无参数

功能:1975ms 动作:1719ms

迭代次数少的旧结果

-x86带参数

功能:28毫秒

动作:31毫秒

-x86不带参数

功能:28毫秒

动作:32毫秒

-x64带参数

功能:39ms

动作:42毫秒

-x64带参数

功能:39ms

动作:34ms


那么,我的测试是错误的还是操作比调用x64机器中的无参数方法更快?

好吧,Henk Holterman有钥匙,我在发布模式下运行它,但从visual studio启动它

手动启动时,它们以相同的速度运行,而不是以更快的速度运行(参数则慢得多)

我很想在这里再次找到那篇文章,我确实找到了这些信息,并将这些结果发送给了他


谢谢大家。

Action
是一名代表。在.NET中,这只是一个方法指针。i、 它只是一个指向方法的指针,所以逻辑上它执行相同的基本指令,并在幕后调用一个方法。没有一般的理由说明为什么操作会比直接调用由操作包装的相同方法更快。在很多情况下,它可能会稍微慢一点,因为它是围绕方法调用的一个抽象级别,但不是以一种有意义的方式进行的。

老实说,我不相信从一开始就有这么小的计时。当它只有几毫秒时,这很容易是因为与您正在运行的代码无关的原因。我会增加迭代的次数,这样你至少会有一秒钟的时间,最好是更长的时间。(我还建议你编辑你的帖子,让代码更容易阅读——没有理由一路上都有这么多的空行。)基准测试很难。比你想象的要难。你还应该在第一次调用时进行“试运行”来解释JIT编译。首先,更好地记录你的结果:调试/发布,IDE附加?使用一些不太可能被优化的代码。如果你找到了这篇文章,请发表——我非常希望避免发表这篇文章。