Zum Hauptinhalt springen

V8 Release v6.8

· 4 Minuten Lesezeit
Das V8-Team

Alle sechs Wochen erstellen wir einen neuen Zweig von V8 im Rahmen unseres Veröffentlichungsprozesses. Jede Version wird direkt vor einem Chrome-Beta-Meilenstein vom Git-Master von V8 abgezweigt. Heute freuen wir uns, unseren neuesten Zweig ankündigen zu können, V8 Version 6.8, der bis zur Veröffentlichung in Zusammenarbeit mit Chrome 68 Stable in einigen Wochen in der Beta-Phase ist. V8 v6.8 ist voller Entwickler-feindlicher Leckerbissen. Dieses Posting bietet eine Vorschau auf einige Highlights in Erwartung der Veröffentlichung.

Speicher

JavaScript-Funktionen hielten unnötig äußere Funktionen und deren Metadaten (bekannt als SharedFunctionInfo oder SFI) am Leben. Insbesondere bei stark funktionalem Code, der auf kurzlebige IIFEs angewiesen ist, konnte dies zu unerwarteten Speicherlecks führen. Vor dieser Änderung hielt ein aktiver Context (d. h. eine Heap-Darstellung einer Funktionsaktivierung) den SFI der Funktion am Leben, die den Kontext erstellt hatte:

Indem der Context auf ein ScopeInfo-Objekt verweist, das die für das Debugging notwendige abgemagerte Information enthält, können wir die Abhängigkeit vom SFI durchbrechen.

Wir haben bereits auf mobilen Geräten über einen Satz der Top 10 Seiten eine Verbesserung des V8-Speichers um 3 % festgestellt.

Parallel dazu haben wir den Speicherverbrauch von SFIs selbst reduziert, unnötige Felder entfernt oder sie, wenn möglich, komprimiert und ihre Größe um ~25 % verringert. Weitere Reduzierungen folgen in zukünftigen Versionen. Wir haben festgestellt, dass SFIs 2–6 % des V8-Speichers auf typischen Websites einnehmen, sogar nachdem sie vom Kontext getrennt wurden, sodass Sie Speicherverbesserungen bei Code mit einer großen Anzahl von Funktionen sehen sollten.

Leistung

Verbesserungen beim Array-Destructuring

Der optimierende Compiler generierte keinen idealen Code für Array-Destructuring. Beispielsweise war das Tauschen von Variablen mit [a, b] = [b, a] bisher doppelt so langsam wie const tmp = a; a = b; b = tmp. Sobald wir Escape-Analysen freigeben konnten, um alle temporären Zuweisungen zu eliminieren, ist das Array-Destructuring mit einem temporären Array genauso schnell wie eine einfache Zuweisungssequenz.

Verbesserungen bei Object.assign

Bisher hatte Object.assign einen schnellen Pfad, der in C++ geschrieben wurde. Das bedeutete, dass die JavaScript-zu-C++-Grenze für jeden Object.assign-Aufruf überschritten werden musste. Eine offensichtliche Möglichkeit, die eingebaute Leistung zu verbessern, war die Implementierung eines schnellen Pfads auf der JavaScript-Seite. Wir hatten zwei Optionen: entweder es als eingebaute native JS zu implementieren (was in diesem Fall zu unnötiger Überkopfbelastung führen würde), oder es unter Verwendung der CodeStubAssembler-Technologie zu implementieren (die mehr Flexibilität bietet). Wir entschieden uns für die letztere Lösung. Die neue Implementierung von Object.assign verbessert den Score von Speedometer2/React-Redux um etwa 15 %, verbessert den gesamten Score von Speedometer 2 um 1,5 %.

Verbesserungen bei TypedArray.prototype.sort

TypedArray.prototype.sort hat zwei Pfade: einen schnellen Pfad, der verwendet wird, wenn der Nutzer keine Vergleichsfunktion bereitstellt, und einen langsamen Pfad für alles andere. Bis jetzt wiederverwendete der langsame Pfad die Implementierung von Array.prototype.sort, die viel mehr tut, als für das Sortieren von TypedArrays notwendig ist. V8 v6.8 ersetzt den langsamen Pfad durch eine Implementierung in CodeStubAssembler. (Nicht direkt CodeStubAssembler, sondern eine domänenspezifische Sprache, die darauf aufbaut).

Die Leistung beim Sortieren von TypedArrays ohne Vergleichsfunktion bleibt gleich, während es bis zu 2,5× schneller ist, wenn eine Vergleichsfunktion verwendet wird.

WebAssembly

In V8 v6.8 können Sie beginnen, trap-basierte Grenzprüfung auf Linux x64-Plattformen zu verwenden. Diese Speicherverwaltungsoptimierung verbessert die Ausführungsgeschwindigkeit von WebAssembly erheblich. Sie wird bereits in Chrome 68 verwendet und in Zukunft werden schrittweise weitere Plattformen unterstützt.

V8 API

Bitte verwenden Sie git log branch-heads/6.7..branch-heads/6.8 include/v8.h, um eine Liste der API-Änderungen zu erhalten.

Entwickler mit einem aktiven V8-Checkout können git checkout -b 6.8 -t branch-heads/6.8 verwenden, um mit den neuen Funktionen in V8 v6.8 zu experimentieren. Alternativ können Sie den Beta-Kanal von Chrome abonnieren und die neuen Funktionen bald selbst ausprobieren.