Was ist Just-In-Time (JIT)-Kompilierung?

0
267

Just-In-Time-Kompilierung oder JIT ist eine Technik, die von Laufzeitinterpreter für Sprachen wie JavaScript, C# und Java, um die Ausführungsgeschwindigkeit näher an die native Leistung vorkompilierter Binärsprachen wie C++ zu bringen.

Compiler vs. Interpreter

Computer wissen nicht, wie man höhere Programmiersprachen wie C++ ausführt, zumindest nicht direkt. Um menschenlesbaren Code in etwas zu übersetzen, das Ihre CPU ausführen kann, muss es konvertiert werden. Ein Computer tut dies normalerweise durch eine von zwei Methoden: Kompilierung oder Interpretation.

Bei der Kompilierung wird ein Compiler ausgeführt, ein Programm, das Quellcode nimmt und in binären Maschinencode umwandelt, bevor die Anwendung ausgeführt wird. Die Kompilierung findet auf dem Computer des Entwicklers statt, bevor sie verpackt und versendet wird. Die meisten ausführbaren Dateien, die Sie herunterladen, sind auf einem bestimmten Niveau kompiliert, um auf Ihrem Computer ausgeführt zu werden, und kompilierter Code ist normalerweise ziemlich schnell, da der Compiler Optimierungen für Ihren speziellen Computer vornehmen kann.

Compiler haben jedoch einige Nachteile. Programme müssen für bestimmte CPU-Befehlssätze (wie x86-64 oder ARM) kompiliert werden. Darüber hinaus müssen selbst Betriebssysteme, die Befehlssätze teilen (wie Windows und Linux, die beide auf Intel-CPUs laufen) aufgrund der vielen Unterschiede in ihrer Funktionsweise separat kompiliert werden.

Dies bedeutet, dass für etwas wie JavaScript, das über das Internet an verbundene Clients gesendet werden muss, es nicht im Voraus kompiliert werden kann, da der Client eine beliebige Kombination aus Befehlssatz und Betriebssystem ausführen könnte.

Dolmetscher gehen einen anderen Weg. Ein Interpreter ist im Grunde ein Software-Roboter, der den Quellcode eines Programms wie eines JavaScript- oder Python-Skripts nimmt und die Ausführung zur Laufzeit übernimmt. Es fungiert im Wesentlichen als mittlere Schicht zwischen dem Quellcode und der Maschine und steht dort, wo ein Compiler es direkt übersetzen würde.

Dies hat den großen Vorteil, dass das Programm nicht für eine bestimmte Maschine erstellt werden muss; Solange die Maschine den Python-Interpreter ausführen kann, kann sie alle Python-Skripte ausführen.

Was macht die JIT-Kompilierung?

Leider für Dolmetscher, sie sind langsam. Ein echter Interpreter muss jede einzelne Anweisung übersetzen und verarbeiten und im Wesentlichen die Arbeit des Compilers für jede Ausführung erledigen. Das ist eine Menge Overhead, daher verwenden die meisten Interpreter wie die V8-JavaScript-Engine, die Java Virtual Machine (JVM) und die Common Language Runtime von .NET die Just-In-Time-Kompilierung, um die Geschwindigkeit zu erhöhen den Dolmetscher auf.

Die Just-In-Time-Kompilierung ist im Wesentlichen ein Compiler, der aufschiebt und den Code für jede Funktion nur dann kompiliert, wenn er benötigt wird. Wenn Sie eine Funktion aufrufen und der JIT-Compiler sie noch nicht gesehen hat, kompiliert er diese Funktion (wobei alle Optimierungen für die Maschine angewendet werden, auf der sie ausgeführt wird) und führt sie aus. Wenn Sie die Funktion das nächste Mal aufrufen, hat sie bereits den Maschinencode zur Hand, also muss sie ihn nur aus dem Cache nachschlagen.

Just-In-Time bezieht sich auf die Tatsache, dass der Interpreter dies nicht tut. 8217;Sie müssen nicht die gesamte App auf einmal kompilieren. Es könnte sicherlich, aber für eine große App würde es zu sehr hohen Startzeiten führen. Es ist besser für die Leistung, nur dann zu kompilieren, wenn es nötig ist (dh gerade rechtzeitig).

Hat die JIT-Kompilierung? ein Performance-Hit?

JIT ist buchstäblich nur eine Leistungsverbesserung gegenüber regulären Interpretern, daher ist es im Vergleich dazu, es gar nicht zu tun, viel schneller. Das Kompilieren von Code ist jedoch nicht besonders schnell, daher führt die Kompilierung zur Laufzeit offensichtlich zu einem Leistungseinbruch, verglichen mit einer direkten Kompilierung in Bytecode vorher.

Werbung

Allerdings, da die JIT-Kompilierung normalerweise muss nur beim ersten Aufruf einer Funktion ausgeführt werden, häufig verwendete Funktionen sehen nur beim ersten Aufruf wirklich einen Leistungseinbruch. Sie können dies in C# mit StopWatches testen,—sie erfassen .NET “Hintergrundrauschen” einschließlich der Zeit, die für die JIT-Kompilierung beim ersten Ausführen einer Funktion aufgewendet wird.

Der Hauptnachteil von JIT-kompilierten Anwendungen ist eine lange Kaltstartzeit, da Tausende von Funktionen, die beim Start aufgerufen werden, direkt beim Start kompiliert werden müssen . Bei einigen ASP.NET-Webanwendungen kann der Bootstrap über eine Minute dauern, teilweise aufgrund der hohen Belastung des JIT-Compilers beim Start.