我能有一个简洁的代码片段,会招致JIT内联吗?(Can I have a concise code

2019-10-30 03:28发布

我想产生一些“Hello World”的大小C#代码段会招致JIT内联。 到目前为止,我有这样的:

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

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

这是我作为编译“版本” - “任何CPU”,并从Visual Studio“没有调试运行”。 它显示我的示例程序组件的名称,以便明确地GetAssembly()不是内联到Main()否则会使显示mscorlib组件名称。

如何撰写一些C#代码段,将招致JIT内联?

Answer 1:

当然,这里有一个例子:

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被内联。



Answer 2:

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

内联表示:“使用函数体在函数调用的地方”。 内联GetAssembly会导致相当于这样的代码:

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


文章来源: Can I have a concise code snippet that would incur JIT inlining please?