zurück zum Artikel

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

Rainald Menge-Sonnentag

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

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 [1] mit den Anbindungen an die für die 2D- und 3D-Grafik-Beschleunigung ausgelegte Schnittstelle WebGL [2] 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 [3] 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 [4]. 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 [5]. Außerdem ist die aktuelle Engine in der Beta zu Chrome 87 enthalten, die Google über den Chrome-Beta-Channel [6] bereitstellt.

(rme [7])


URL dieses Artikels:
https://www.heise.de/-4938527

Links in diesem Artikel:
[1] https://docs.google.com/document/d/1nK6oW11arlRb7AA76lJqrBIygqjgdc92aXUPYecc9dU/edit
[2] https://developer.mozilla.org/de/docs/Web/API/WebGL_API
[3] https://github.com/tc39/proposal-atomics-wait-async/blob/master/PROPOSAL.md
[4] https://v8.dev/blog/v8-release-87
[5] https://v8.dev/docs/source-code#using-git
[6] https://www.google.com/chrome/beta/
[7] mailto:rme@ix.de