Kann ich bitte einen prägnanten Codeausschnitt haben, der JIT-Inlining erfordern würde?

StackOverflow https://stackoverflow.com//questions/12686850

  •  12-12-2019
  •  | 
  •  

Frage

Ich versuche, ein C#-Codefragment der Größe „Hello World“ zu erstellen, das JIT-Inlining erfordern würde.Bisher habe ich Folgendes:

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

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

die ich als „Release“ – „Any CPU“ und „Run without debugging“ aus Visual Studio kompiliere.Der Name meiner Beispielprogramm-Assembly wird so deutlich angezeigt GetAssembly() ist nicht eingebunden Main(), andernfalls würde es angezeigt werden mscorlib Baugruppenname.

Wie verfasse ich einen C#-Codeausschnitt, der JIT-Inlining erfordern würde?

War es hilfreich?

Lösung

Klar, hier ist ein Beispiel:

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();
        }
    }
}

Kompilieren Sie in einem Release-ähnlichen Modus:

csc /o+ /debug- Test.cs

Laufen:

c:\Users\Jon\Test>test

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

Beachten Sie den Stack-Trace – er sieht so aus Throw wurde direkt angerufen von Main, weil der Code für CallThrow war eingebunden.

Andere Tipps

Ihr Verständnis von Inlining scheint falsch zu sein:Wenn GetAssembly Wenn es inline ist, wird immer noch der Name Ihres Programms angezeigt.

Inlining bedeutet:„Verwenden Sie den Hauptteil der Funktion an der Stelle des Funktionsaufrufs.“Inlining GetAssembly würde zu folgendem Code führen:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(System.Reflection.Assembly.GetCallingAssembly()
                                                    .FullName);
        Console.ReadLine();
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top