Kann ich bitte einen prägnanten Codeausschnitt haben, der JIT-Inlining erfordern würde?
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?
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();
}
}