C#预先调用后,在时间测量中的功能更快吗?

时间:2016-01-24 18:51:33

标签: c# function call stopwatch measurement

我只是试图找出为什么函数在测量时间之后被调用一次似乎运行得更快。

以下是我的测量代码示例:

            float X = 0;
        FastMath.FireUp(); // Does nothing in this sample
        Stopwatch watch = new Stopwatch();
        watch.Start();
        for (int i = 0; i < 5; i++)
        {
            X = FastMath.FastSin(i);
        }
        watch.Stop();
        Console.WriteLine("TIME : " + watch.Elapsed );

在这里你可以看到我的被叫功能:

        public static float FastSin(float val)
    {
        int index = 360 - ((int)val % 360);
        if(index == 360)
        {
            return 0;
        }
        return -TRIGONOMETRIC_LOOKUPTABLE[index];
    }

所以问题是,我的测量显示以下输出:

  

时间:00:00:00.0001196

让我们填补&#34; FireUp&#34;功能:

float x = FastSin(123);

现在测量时间明显减少:

  

00:00:00.0000015

但是,在FireUp功能中没有调用的#34; FastCos&#34;仍然需要更长的时间。

我应该提到的另外两点:

  • 如果我不打电话给&#34; FireUp&#34;功能,时间再次增加:
      

    时间:00:00:00.0002796

  • 如果我填写了我的&#34; FireUp&#34;功能:

    float x = FastSin(123); x = FastCos(123);

    在未来的测量中,它对于两种功能都运行良好。 现在每个功能需要TIME:00:00:00.0000019。

为什么会这样?

2 个答案:

答案 0 :(得分:3)

  

编译为托管代码时,编译器会翻译您的源代码   代码转换为Microsoft中间语言(MSIL),这是一个   与CPU无关的指令集,可以有效地转换   到本机代码。

在运行时MSIL代码(由JIT编译)到二进制平台相关代码。 CLR编译刚刚使用过的代码paerts,然后它会在第一次调用之前编译FastSin方法。

  

运行时提供另一种称为安装时的编译模式   代码生成。安装时代码生成模式转换MSIL   与常规JIT编译器一样,本机代码,但它转换   一次更大的代码单元,存储生成的本机代码   随后加载并运行装配时使用。

您可以详细了解MSILCompiling MSIL to Native Code

答案 1 :(得分:1)

该方法正好及时编译(jit)。这就是为什么它在被调用之后会更快。