Webentwicklung: Firefox 83 beschleunigt JavaScript-Code im JIT-Compiler

Mit dem Projekt "WarpBuilder" haben die Firefox-Entwickler die JavaScript-Engine fĂĽr den Browser Firefox 83 grunderneuert. Warp ist ab jetzt der Default-Modus.

vorlesen Druckansicht 74 Kommentare lesen

(Bild: Jolanda Aalbers / Shutterstock.com)

Lesezeit: 3 Min.
Von
  • Silke Hahn
Inhaltsverzeichnis

Das Mozilla-Team hat die JavaScript-Engine für den Browser Firefox grundlegend erneuert: In der neuen Hauptversion Firefox 83 erhält SpiderMonkey, wie die Engine auch heißt, als Standardeinstellung den neuen WarpBuilder implementiert. Die Veröffentlichung ist für den 17. November 2020, das heutige Datum, angekündigt.

Warp bringt Veränderungen an den JIT-Compilern (Just-in-time), die für höhere Responsivität, rascheres Laden von Webseiten und eine bessere Speichernutzung sorgen sollen. Die neue Architektur gilt laut Blogankündigung als pflegeleichter in der Wartung und soll auch zusätzliche Features in der JavaScript-Engine zugänglich machen.

Videos by heise

Aktuelle JavaScript-Engines parsen Quellcode in niederschwelligen Bytecode und bieten dann mehrere Möglichkeiten: Interpreter können Bytecode unmittelbar ausführen, alternativ können JIT-Compiler ihn zu nativem Code kompilieren. Bei herkömmlichen Interpretern und JIT-Compilern läuft die Kompilierung schnell, der Code erfährt über Inline-Caches nur grundlegende Anpassungen. Eine alternative JIT-Variante, die SpiderMonkey nun zusätzlich nutzt, kann den Code stärker optimieren, sodass er im Ergebnis schneller wird. Dieses optimierte JIT-Compiling benötigt etwas mehr Speicherplatz und Zeit. Daher greift die Engine nur bei häufig aufgerufenen Funktionen zu dieser Optimierung. Die neue JavaScript-Engine von Firefox soll laut Blogeintrag beide Methoden des JIT-Compilens kombinieren.

Vereinfachte Darstellung der zwei Methoden zum JIT-Kompilieren mit dem WarpBuild der JavaScript-Engine von Firefox 83

(Bild: Mozilla.org)

Bislang hatte bei Firefox ein Compiler namens IonMonkey das JIT-Kompilieren erledigt, indem er überwiegend per Type Inference (TI) globale Informationen über die im JavaScript-Code enthaltenen Objekte sammelte und den Interpreter sowie das Baseline-JIT mit CacheIR-Daten in einem einfachen linearen Bytecode-Format fütterte. Der WarpBuild verändert die Methode des JIT-Kompilierens, indem er sich nun ganz auf die Datensammlung des CacheIR von den Baseline-Tiers stützt.

JIT-Kompilieren mit dem WarpBuild basiert auf der Datensammlung des CacheIR.

(Bild: Mozilla.org)

Die Warp-Methode in der erneuerten JavaScript-Engine des Browsers kompiliert häufig aufgerufene JavaScript-Funktionen in drei Schritten: (1) WarpOracle läuft auf dem Haupt-Thread und erstellt einen Snapshot der CacheIR-Daten der Baseline, was relativ rasch vonstatten gehen soll. (2) Der WarpBuilder läuft jenseits des Threads (off-thread) und erstellt aus dem Snapshot einen als MIR (Mid-Level Intermediate Representation) bezeichneten Zwischencode. Dieser Vorgang läuft im Hintergrund und beeinträchtigt offenbar die Prozesse auf dem Haupt-Thread nicht. (3) Abschließend optimiert die JavaScript-Engine – ebenfalls "off-thread" – das JIT-Backend: Sie bearbeitet den Zwischencode weiter und generiert daraus Maschinencode. Vereinfacht gesagt verwebt der WarpBuilder den Bytecode und die CacheIR-Anweisungen zu einem einzigen MIR-Graphen.

Warp ersetzt im aktuellen Build mit dem Zwischencode MIR das Frontend des bisherigen JIT-Compilers IonMonkey. In einem nächsten Schritt sollen bis Firefox 85 der alte Code und die obsolet gewordene Architektur entfallen. Parallel plant das Firefox-Team, das Backend des IonMonkey zu vereinfachen und stark JavaScript-haltige Workloads weiter zu beschleunigen. Für CacheIR soll es künftig ein Tool geben, mit dem Webentwickler die CacheIR-Daten für JavaScript-Funktionen untersuchen können.

Mehr Informationen zum aktuellen Release lassen sich dem Blogeintrag der Firefox-Entwickler bei Mozilla entnehmen. In dem Beitrag finden Interessierte auch Performance-Vergleiche der bisherigen und der aktuellen Compiler sowie der Speichernutzung.

(sih)