JavaScript: V8 7.5 optimiert die Verarbeitung von WebAssembly-Inhalten

Die Open-Source-Engine cached kompilierte WebAssembly-Module implizit und hat neue Methoden zum Kopieren und Füllen großer Speicherblöcke.

In Pocket speichern vorlesen Druckansicht 9 Kommentare lesen
JavaScript: V8 7.5 optimiert WebAssembly-Module
Lesezeit: 3 Min.

Google hat Version 7.5 der JavaScript-Implementierung V8 veröffentlicht. Die Neuerungen zielen vor allem auf eine verbesserte Performance für JavaScript und WebAssembly. Außerdem verzögert der Main-Thread von Chrome nicht mehr das Streamen von Skripten, und in JavaScript-Sourcen sind Unterstriche als Trennzeichen in numerischen Variablen erlaubt. Wie üblich hat das V8-Release Beta-Status, bis die zugehörige Chrome-Version erscheint.

Chromium soll ab der Veröffentlichung von Chrome 75 implizit kompilierte WebAssembly-Artefakte im Cache ablegen. Daher muss der Browser beim erneuten Besuch einer Seite die dort verwendeten und unveränderten WebAssembly-Module nicht erneut kompilieren, was die Startzeit der WebAssembly-Inhalte verbessert. Der Cache arbeitet analog zum Cache für JavaScript-Code, zu dem das V8-Team im April einen Blogbeitrag mit Optimierungstipps für Softwareentwickler veröffentlicht hat.

V8 bekommt zudem zwei neue Anweisungen, mit denen sich große Speicherbereiche kopieren, füllen beziehungsweise initialisieren lassen. memory.copy kopiert wie die C-Funktion memmove Daten aus einem Bereich in einen anderen. Ein potenzielles Überlappen der beiden Regionen ist kein Hinderungsgrund. Dasselbe gilt für den neuen Befehle table.copy zum Kopieren von Tabellenelementen. Der Neuzugang memory.fill füllt wie die C-Funktion memset einen Speicherbereich mit einem Byte-Wert.

Mit memory.init beziehungsweise table.init lassen sich konstante Bereiche in den Speicher oder eine Tabelle überführen. Dazu dienen sogenannte passive Segmente, wie folgendes Beispiel aus dem V8-Blog zeigt:

;; Definition eines passiven Datensegments
(data $hello passive "Hallo WebAssembly")

;; Kopiere "Hallo" in den Speicher ab Adresse 10.
(memory.init (i32.const 10) (i32.const 0) (i32.const 5))

;; Kopiere "WebAssembly" in den Sepicher ab Adresse 1000.
(memory.init (i32.const 1000) (i32.const 6) (i32.const 11))

Das aktuelle V8-Release kann Skripte direkt in den Streaming-Parser einbringen. Zwar hat die Engine auch in früheren Versionen bereits JavaScript-Inhalte gestreamt, lief dabei aber immer über den Haupt-Thread von Chrome, der im Zweifel das Nadelöhr darstellte. So musste der Parser teilweise auf Skripte warten, die zwar bereits gestreamt waren, jedoch noch beim Haupt-Thread von Chrome auf die Verarbeitung warteten, wenn er mit anderen Arbeiten wie dem Ausführen weiterer JavaScript-Inhalte oder dem Parsen von HTML beschäftigt war.

Das Warten auf den Haupt-Thread von Chrome verzögerte bisher das Parsen gestreamter Skripte.

(Bild: V8-Blog)

Als syntaktischen Zucker akzeptiert V8 in JavaScript nun zu Gunsten der Lesbarkeit Unterstriche als Trennzeichen für numerische Literale und folgt damit zahlreichen anderen Sprachen, wie jüngst Scala. Die Trennung ist sowohl vor als auch nach dem Komma erlaubt. Neben Dezimalwerten lassen sich auch Hexadezimal-, Oktal- und Dualzahlen passend trennen wie in folgenden Beispielen:

1_234_567.890_123
0b0101_1010_1111_0000 // oder auch 0b01011010_11110000
0x01_FF_02_EE

Weitere Neuerungen in V8 7.4 lassen sich dem V8-Blog entnehmen. Eine Anleitung, wie Entwickler auf das Git-Repository zugreifen können, findet sich in der V8-Dokumentation. Außerdem ist die aktuelle Engine in der Beta zu Chrome 75 enthalten, die Google über den Chrome-Beta-Channel bereitstellt. (rme)