1 Reaktion

Firefox 23: Neuer Baseline-Compiler macht JavaScript schneller

Geschätzte Lesedauer:

Mozillas Verbesserungen an der JavaScript-Engine gehen in die nächste Runde. In der Entwicklerversion von Firefox 23 ist nun nach rund sechs Monaten Arbeit ein neuer Baseline-Compiler gelandet, welcher die Ausführung von JavaScript weiter beschleunigen soll.

Der neue Baseline-Compiler, welcher fast schon Mozilla-untypisch keinen *Monkey-Namen erhalten hat, verbessert zunächst einmal die JavaScript-Performance, soll vor allem aber auch der Grundstein für weitere Performance-Optimierungen in der Zukunft sein. In den Benchmarks Octane, Sunspider und Kraken werden im Vergleich derzeit um 5-10% bessere Ergebnisse erzielt.

So viele Monkeys – ich blicke nicht durch

Mozilla verwendet in in der JavaScript-Engine von Firefox, SpiderMonkey, derzeit zwei Just-in-Time-Compiler, den mit Firefox 4 eingeführten JägerMonkey und den mit Firefox 18 eingeführten IonMonkey. Zunächst werden sämtliche Funktionen vom Interpreter ausgeführt, welcher ziemlich langsam ist, aber Typinformationen für die JIT-Compiler sammelt. „Heißer Code“ wird dann von JägerMonkey kompiliert, welcher die gesammelten Typinformationen nutzt, um den Code entsprechend zu optimieren. Der daraus erzeugte Code ist zwar schnell, aber nicht besonders optimiert. „Sehr heißer Code“ wird darum noch einmal von IonMonkey kompiliert, welcher sich mehr Zeit nimmt und dank besonderer Optimierungen schnelleren Code erzeugt.

Die richtige Balance

Die richtige Balance zwischen den verschiedenen Optimierungsstufen ist dabei entscheidend für eine möglichst gute JavaScript-Performance. IonMonkey benötigt für seine starken Optimierungen sehr viel Zeit. Werden Funktionen zu früh von IonMonkey kompiliert, ist es wahrscheinlicher, dass sich Typinformationen hinterher noch ändern und die Engine würde viel Zeit mit dem Kompilieren von Ion-kompilierten Funktionen verschwenden, welche wieder verworfen werden. Wartet die SpiderMonkey-Engine hingegen zu lange mit dem Kompilieren, wird zu viel Zeit für das Interpretieren aufgewendet. Da JägerMonkey nicht annähernd so viel Zeit in die Optimierung wie IonMonkey steckt, ist JägerMonkey deutlich schneller.

Die Probleme mit der aktuellen Lösung

Bisher nimmt JägerMonkey die Rolle des Baseline-Compilers für IonMonkey ein, wurde hierfür allerdings nie entwickelt. Der neue Baseline-Compiler wurde speziell für IonMonkey entwickelt und soll dementsprechende Vorteile bringen.

Ein Problem mit der aktuellen Lösung ist, dass weder JägerMonkey noch IonMonkey Typinformationen sammeln und sich der generierte JIT-Code auf diese Typinformationen verlässt und damit nur so lange läuft, wie diese Typinformationen gültig sind. Ändert sich die Typinformation einer Funktion zur Laufzeit, muss SpiderMonkey die Ausführung im Interpreter neu beginnen um weitere Typinformationen zu sammeln. Diese gesammelten Typinformationen sind außerdem ziemlich eingeschränkt, was die Möglichkeiten der Optimierungen durch IonMonkey einschränkt. Mit der in Firefox 9 eingeführten Typinferenz gab es in dieser Hinsicht zwar schon Verbesserungen, aber teilweise stehen immer noch relativ wenige Informationen zur Verfügung. Dazu kommt, dass JägerMonkey den Heap-Stack direkt verwendet, während IonMonkey den deutlich schnelleren nativen C-Stack verwendet, was die Aufrufe zwischen JängerMonkey- und IonMonkey-Code langsam macht. Ein weiteres Problem ist, dass eine Menge des Codes, welcher im Web vorzufinden ist, nicht „heiß“ genug für eine Kompilation mit JägerMonkey sind, denn auch wenn JägerMonkey deutlich schneller als IonMonkey ist, ist JägerMonkey recht komplex und benötigt eben auch seine Zeit, so dass die Schwelle für JägerMonkey relativ hoch gesetzt wurde.

Neuer Baseline-Compiler setzt an Schwachstellen an

Der neue Baseline-Compiler setzt an genau diesen Schwachpunkten an. Er sammelt mehr Typinformationen, welche von IonMonkey genutzt werden können, um den Code zu optimieren. Baseline-JIT-Code reagiert auf dynamische Änderungen und erfordert dadurch nie, dass der Code erneut kompiliert werden muss, wenn sich Typinformationen ändern. Der Baseline-Compiler erlaubt eine 10-100-fach schnellere Ausführung als Code, welcher vom Interpreter ausgeführt wird. Außerdem verwendet der Baseline-Compiler genau wie IonMonkey den C-Stack, was die Kommunikation untereinander beschleunigt. Schließlich ist der Baseline-Compiler weit weniger komplex als JägerMonkey oder IonMonkey und teilt eine Menge gemeinsamen Code mit IonMonkey. Außerdem soll es ziemlich einfach sein, den Baseline-Compiler dahingehend zu erweitern, neue Typinformationen zu sammeln oder für neue Anwendungsfälle zu optimieren.

Ausblick auf weitere Verbesserungen

Wie eingangs erwähnt, bringt der neue Baseline-Compiler nicht nur eine 5-10% bessere Performance in den populären JavaScript-Benchmarks, sondern legt auch den Grundstein für weitere Verbesserungen. So ist im Laufe des Jahres laut Mozilla mit weiteren Verbesserungen der Performance sowie signifikanten Einsparungen beim Speicherverbrauch zu rechnen. Der Baseline-Compiler ist darauf ausgelegt, JägerMonkey zu ersetzen. Nach derzeitigem Stand der Planung soll JägerMonkey mit Firefox 24 entfernt werden.

Dieser Artikel wurde von Sören Hentzschel verfasst.

Sören Hentzschel ist Webentwickler aus Salzburg. Auf soeren-hentzschel.at informiert er umfassend über Neuigkeiten zu Mozilla. Außerdem ist er Betreiber von camp-firefox.de, der ersten Anlaufstelle im deutschsprachigen Raum für Firefox-Probleme aller Art. Weitere Projekte sind firefox.agenedia.com, mozilla.de, firefoxosdevices.org sowie sozone.de.

Und jetzt du! Deine Meinung?

Erforderliche Felder sind mit einem Asterisk (*) gekennzeichnet. Die E-Mail-Adresse wird nicht veröffentlicht.
  1. Nach Absenden des Kommentar-Formulars erfolgt eine Verarbeitung der von Ihnen eingegebenen personenbezogenen Daten durch den datenschutzrechtlich Verantwortlichen zum Zweck der Bearbeitung Ihrer Anfrage auf Grundlage Ihrer durch das Absenden des Formulars erteilten Einwilligung.
    Weitere Informationen