我可以提供一个简洁的代码片段,它会引发JIT内联吗?

时间:2012-10-02 08:26:51

标签: c# .net jit inlining

我正在尝试制作一些会导致JIT内联的“Hello World”大小的C#代码段。到目前为止,我有这个:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine( GetAssembly().FullName );
        Console.ReadLine();
    }

    static Assembly GetAssembly()
    {
        return System.Reflection.Assembly.GetCallingAssembly();
    }
}

我从Visual Studio编译为“Release” - “Any CPU”和“Run without debugging”。它显示了我的示例程序集的名称,因此GetAssembly()没有内联到Main(),否则会显示mscorlib程序集名称。

如何编写一些会导致JIT内联的C#代码片段?

2 个答案:

答案 0 :(得分:6)

当然,这是一个例子:

using System;

class Test
{
    static void Main()
    {
        CallThrow();
    }

    static void CallThrow()
    {
        Throw();
    }

    static void Throw()
    {
        // Add a condition to try to disuade the JIT
        // compiler from inlining *this* method. Could
        // do this with attributes...
        if (DateTime.Today.Year > 1000)
        {
            throw new Exception();
        }
    }
}

以类似发布的模式编译:

csc /o+ /debug- Test.cs

执行命令

c:\Users\Jon\Test>test

Unhandled Exception: System.Exception: Exception of type 'System.Exception' was
thrown.
   at Test.Throw()
   at Test.Main()

请注意堆栈跟踪 - Throw直接调用Main,因为CallThrow的代码已内联。

答案 1 :(得分:1)

您对内联的理解似乎不正确:如果内联GetAssembly,它仍会显示您的程序名称。

内联意味着:“在函数调用的位置使用函数体”。内联GetAssembly会导致代码与此相当:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(System.Reflection.Assembly.GetCallingAssembly()
                                                    .FullName);
        Console.ReadLine();
    }
}