0

我正在尝试生成一些会导致 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# 代码片段?

4

2 回答 2

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,因为 for 的代码CallThrow是内联的。

于 2012-10-02T08:36:33.373 回答
1

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

内联意味着:“在函数调用的地方使用函数体”。内联GetAssembly将导致与此等效的代码:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(System.Reflection.Assembly.GetCallingAssembly()
                                                    .FullName);
        Console.ReadLine();
    }
}
于 2012-10-02T08:31:04.433 回答