JavaScript-Engine: V8 8.7 beschleunigt native Aufrufe und erweitert Threading

Neben der neuen Fast C API für schnellere Aufrufe nativer C++-Funktionen bringt Googles JavaScript-Engine eine nicht blockierende Variante von Atomics.wait.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 2 Min.
Von
  • Rainald Menge-Sonnentag

Google hat Version 8.7 der JavaScript-Engine V8 veröffentlicht. Das Release bringt eine syntaktische Neuerung mit, die das asynchrone Überwachen von Speicherbereichen in Threads ermöglicht. Außerdem existiert eine neue API, die C++-Aufrufe beschleunigen soll.

Die Fast C API soll das Zusammenspiel zwischen den in der Engine laufenden JavaScript-Anwendungen und C++-Code verbessern. Laut dem V8-Team haben sich die JavaScript-Bindings zwischen der Engine und dem für das Einbinden zuständigen Embedder als Nadelöhr für performancekritische Funktionen erwiesen.

Die ursprüngliche Implementierung entstand laut der Erklärung zur Fast C API mit den Anbindungen an die für die 2D- und 3D-Grafik-Beschleunigung ausgelegte Schnittstelle WebGL beziehungsweise dessen Nachfolger WebGPU. Allerdings wird sie den Performanceansprüchen von API-Aufrufen nicht gerecht, die beispielsweise sehr hardwarenah sind. Die neue API kennt nicht nur die POD-C++-Typen (Plain Old Data), sondern bereits zum jetzigen Stand einige erweiterte Typen, und sie ist für zusätzliche Ergänzungen wie int64_t oder auch TypedArray vorbereitet.

Die Fast C API erstellt das interne Struct v8::CFunctionInfo, das die Signaturen der Callbacks bezüglich der C++-Typen repräsentiert. Zum Verwenden müssen Entwickler zunächst einen Callback mit einer spezifischen Signatur erstellen und anschließend die v8::CFunction::Make-Methode mit dem Callback aufrufen, um eine passende Instanz der v8::CFunction zu erstellen. Anschließend arbeiten sie wie gewohnt über die v8::FunctionTemplate, die neben dem Fast-API- den regulären Callback erhält.

Die syntaktische Ergänzung für Atomics greift wie häufig bei V8 einem geplanten JavaScript-Standard vor: Atomics.waitAsync ist eine nicht blockierende Variante von Atomics.wait, das eine Position in einem Int32Array auf einen Wert überprüft. Da die reine Atomics.wait-Methode den Programmablauf blockiert, ist sie nicht in main zugelassen, die asynchrone Variante dagegen schon.

Weitere Details lassen sich dem V8-Blog entnehmen. Wie üblich hat das Release der JavaScript-Engine Beta-Status, bis die zugehörige Chrome-Version 87 als stabiles Release erscheint. 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 87 enthalten, die Google über den Chrome-Beta-Channel bereitstellt.

(rme)