C#:为什么函数调用比手动内联更快?

Kna*_*bax 16 c# performance release inline inline-code

我已经测量了两种计算2的幂的方法的执行时间:

1)内联

result = b * b;
Run Code Online (Sandbox Code Playgroud)

2)通过简单的函数调用

result = Power(b);
Run Code Online (Sandbox Code Playgroud)

在调试模式下运行时,一切都按预期进行:调用函数比在线计算(行中385毫秒与函数调用570毫秒)相比要昂贵得多.

在发布模式下,我希望编译器能够大大加快函数调用的执行时间,因为编译器会在内部内联非常小的Power()函数.但我不希望函数调用比手动内联计算更快.

最令人惊讶的是这种情况:在发布版本中,第一次运行需要109 ms,而第二次运行Power()需要62 ms.

函数调用如何比手动内联更快?

以下是您的复制程序:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Starting Test");

        // 1. Calculating inline without function call
        Stopwatch sw = Stopwatch.StartNew();

        for (double d = 0; d < 100000000; d++)
        {
            double res = d * d;
        }

        sw.Stop();
        Console.WriteLine("Checked: " + sw.ElapsedMilliseconds);

        // 2. Calulating power with function call
        Stopwatch sw2 = Stopwatch.StartNew();

        for (int d = 0; d < 100000000; d++)
        {
            double res = Power(d);
        }

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

        Console.ReadKey();
    }

    static double Power(double d)
    {
        return d * d;
    }
}
Run Code Online (Sandbox Code Playgroud)

Xav*_*tte 50

你的测试是错误的.在第二部分中,您使用的是a int d而不是double.也许它解释了时差.


Dan*_*rth 22

正如Xavier正确发现的那样,你在一个循环中使用double,而在另一个循环中使用int.将两者更改为相同类型将使结果相同 - 我测试了它.

此外:您在这里测量的是添加和比较的持续时间.您没有测量平方的持续时间d,因为它根本没有发生:在发布版本中,优化器完全删除了循环体,因为结果未被使用.您可以通过注释掉循环体来确认这一点.持续时间是一样的.