Inlining

Aus Das Sopra Wiki
Wechseln zu: Navigation, Suche

Der Hintergrundgedanke von Inlining[1] ist, daß Sprünge im Code und damit auch im Speicher Performance kosten. Auch durch entfällt das Kopieren von Parametern zum Teil.

Prinzipiell ist es relativ einfach, eine Methode zu inlinen. Dabei wird der kompillierte Code nicht als eigene Methode gespeichert, sondern anstelle des Methodenaufrufes eingefügt.

Aus

public int Max(int Zahl1, int Zahl2)
{
    return Zahl1 > Zahl2 ? Zahl1 : Zahl2;
}

public void DoSomethingWithAMaxNumber()
{
    int ersteZahl, zweiteZahl;
    ...
    int Wert = Max(ersteZahl, zweiteZahl);
    ...
}

wird dann im Kompilat

public void DoSomethingWithAMaxNumber()
{
    int ersteZahl, zweiteZahl;
    ...
    int Wert = ersteZahl > zweiteZahl ? ersteZahl : zweiteZahl;
    ...
}

Dadurch kann der Sprung an eine unter Umständen sehr weit entfernt liegende Funktion vermieden werden.

Das .Net-Framework versucht auch, Inlining über Assembly-Grenzen hinweg durchzuführen. Dies ist möglich, weil der Compiler ein Programm zu Bytecode kompilliert.[2] [3] [4]

Probleme

Virtuelle Methoden können aufgrund der Polymorphie im objektorientierten Programmieren nicht oder nur sehr begrenzt geinlined werden.

Das Compact Framework kann nur für Methoden, deren Bytecode nicht größer als 16 Bytes ist inlinen.[5]

Da in einer Release-Konfiguration stärker optimiert wird kann sich das Programm anders verhalten. Auf einem 64-Bit-system kann man dies erstaunlich einfach zeigen. Man braucht dazu ein kleines Programm, das folgende Zeilen enthält

public static void Main()
{
    o();
}

public static Object o()
{
    return o();
}

Aus Visual Studio heraus gestartet wird ziemlich sofort eine StackOverflowException geworfen. Wenn man das Programm in der Release-Konfiguration direkt aus dem Explorer startet läuft es. Diese Optimierung heißt Tail Call[6] und ist mit der Endrekursion in funktionalen Sprachen vergleichbar.

Referenzen

  1. Wikipedia-Artikel zu Inlining
  2. http://blogs.msdn.com/davidnotario/archive/2004/10/28/248953.aspx David Notario: JIT optimizations (I)
  3. http://blogs.msdn.com/davidnotario/archive/2004/11/01/250398.aspx David Notario: JIT optimizations (II)
  4. http://www.hanselman.com/blog/ReleaseISNOTDebug64bitOptimizationsAndCMethodInliningInReleaseBuildCallStacks.aspx Scott Hanselman: Release IS NOT Debug: 64bit Optimizations and C# Method Inlining in Release Build Call Stacks
  5. http://blogs.msdn.com/netcfteam/archive/2005/05/04/414820.aspx .NET Compact Framework version 2.0 Performance and Working Set FAQ
  6. http://blogs.msdn.com/davbr/pages/tail-call-jit-conditions.aspx David Broman: Tail call JIT conditions