Was es ist
In C und C ++ verwenden Sie das Inline-Schlüsselwort, um dem Compiler zu sagen, dass er eine Routine aufrufen soll, ohne dass die Parameter auf den Stack geschoben werden müssen. Die Funktion hat stattdessen ihren Maschinencode in die Funktion eingefügt, in der sie aufgerufen wurde. Dies kann in bestimmten Szenarien zu einer deutlichen Leistungssteigerung führen.
Gefahren
Die Geschwindigkeitsvorteile beim Verwenden von "Inlining" verringern sich signifikant, wenn die Größe der Inline-Funktion zunimmt. Die Überlastung kann dazu führen, dass ein Programm langsamer ausgeführt wird. Das Inlining einer sehr kleinen Accessor-Funktion verringert normalerweise die Code-Größe, während das Inlining einer sehr großen Funktion die Code-Größe drastisch erhöhen kann.
Inlining in C #
In C # findet das Inlining auf der JIT-Ebene statt, in der der JIT-Compiler die Entscheidung trifft. Momentan gibt es in C # keinen Mechanismus, den Sie explizit ausführen können. Wenn Sie wissen möchten, was der JIT-Compiler macht, können Sie zur Laufzeit " System.Reflection.MethodBase.GetCurrentMethod().Name
" aufrufen. Wenn die Methode inline ist, wird stattdessen der Name des Aufrufers zurückgegeben.
In C # können Sie eine Methode nicht zum Inline-Erzwingen erzwingen, aber Sie können eine Methode erzwingen. Wenn Sie wirklich Zugriff auf einen bestimmten Callstack benötigen und Inlining entfernen müssen, können Sie Folgendes verwenden: MethodImplAttribute
mit MethodImplOptions.NoInlining
. Wenn eine Methode als virtuell deklariert wird, wird sie auch nicht vom JIT inline gesetzt. Der Grund dafür ist, dass das endgültige Ziel des Anrufs unbekannt ist.
Zur Definition und Diskussion von Inlining siehe diese Frage .
In C # müssen Sie den Compiler oder die Laufzeit nicht inline anweisen, da die Laufzeit dies automatisch tut.
P.S. Diese Antwort ist auch für Java richtig.
Inlining ist, wenn statt einer bestimmten Funktion der Inhalt der Funktion direkt an der Call-Site ausgeführt wird. Der Hauptgrund hierfür besteht darin, dass der Aufwand für das Aufrufen einer Funktion durch Ausführen der Funktionsinhalte auf der Callsite entfällt.
Es wird als Optimierungstechnik verwendet. Im Fall von C # hängt es tatsächlich von der CLR JIT-Engine ab, die Arbeit zu erledigen. Zur Laufzeit wird die JIT-Engine beim Kompilieren einer Methode eine Heuristik verwenden, um festzustellen, ob eine inline-Funktion geeignet ist und eine effektive Optimierung darstellt. Ist dies der Fall, wird ein Inline-Vorgang ausgeführt.
Vance hat einen großartigen Artikel darüber, was das JIT beim Inlining berücksichtigt: Ссылка
Es gibt keine Möglichkeit, ein Inline in C # zu erzwingen. Die Sprache unterstützt dieses Konstrukt nicht. Vor allem, weil die Leute sehr schlecht beurteilen, was optimiert werden sollte. Der JITer ist ein viel besserer Richter.
Um Eric Gunnerson zu zitieren
Inlining geschieht auf JIT-Ebene, und die JIT trifft im Allgemeinen eine anständige Entscheidung