Zum Hauptinhalt springen

V8-Version v6.4

· 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 von V8s Git Master abgezweigt. Heute freuen wir uns, unseren neuesten Zweig, V8-Version 6.4, bekannt zu geben, der sich bis zur Veröffentlichung in Zusammenarbeit mit Chrome 64 Stable in mehreren Wochen in der Beta-Phase befindet. V8 v6.4 ist voller Entwicklerfreundlicher Verbesserungen. In diesem Beitrag geben wir einen Überblick über einige Highlights, die auf die Veröffentlichung vorbereiten.

Geschwindigkeit

V8 v6.4 verbessert die Leistung des instanceof-Operators um das 3,6-fache. Als direktes Ergebnis ist uglify-js laut V8s Web Tooling Benchmark jetzt 15–20 % schneller.

Diese Veröffentlichung behebt auch einige Leistungseinbrüche bei Function.prototype.bind. Beispielsweise wird TurboFan nun konsequent alle monomorphen Aufrufe von bind inline geschaltet. Darüber hinaus unterstützt TurboFan auch das Gebundene Callback-Muster, was bedeutet, dass anstelle des Folgenden:

doSomething(callback, someObj);

Jetzt folgendes verwendet werden kann:

doSomething(callback.bind(someObj));

Auf diese Weise ist der Code besser lesbar und bietet trotzdem die gleiche Leistung.

Dank der neuesten Beiträge von Peter Wong werden WeakMap und WeakSet nun mit dem CodeStubAssembler implementiert, was zu Leistungsverbesserungen von bis zu 5× in allen Bereichen führt.

Als Teil von V8s laufender Bemühungen, die Leistung von Array-Built-ins zu verbessern, wurde die Leistung von Array.prototype.slice um ~4× verbessert, indem es mit dem CodeStubAssembler neu implementiert wurde. Außerdem werden Aufrufe von Array.prototype.map und Array.prototype.filter nun in vielen Fällen inline geschaltet, wodurch sie eine Leistungsprofil bieten, das mit handgeschriebenen Versionen konkurriert.

Wir haben daran gearbeitet, dass Zugriffe außerhalb der Grenzen von Arrays, typisierten Arrays und Zeichenketten keine ~10× Leistungseinbuße mehr bedeuten, nachdem wir festgestellt haben, dass dieses Codierungsmuster in der Praxis verwendet wird.

Speicher

V8s eingebettete Code-Objekte und Bytecode-Handler werden jetzt standardmäßig beim Snapshot lazy deserialisiert, was den Speicherverbrauch pro Isolate erheblich reduzieren kann. Benchmarks in Chrome zeigen Einsparungen von mehreren Hundert KB pro Tab beim Durchsuchen gängiger Websites.

Freuen Sie sich auf einen dedizierten Blogbeitrag zu diesem Thema Anfang nächsten Jahres.

ECMAScript-Sprachfunktionen

Diese V8-Version bietet Unterstützung für zwei neue spannende Funktionen bei regulären Ausdrücken.

In regulären Ausdrücken mit dem /u-Flag sind Unicode-Eigenschaftsfluchten jetzt standardmäßig aktiviert.

const regexGreekSymbol = /\p{Script_Extensions=Greek}/u;
regexGreekSymbol.test('π');
// → true

Die Unterstützung für benannte Erfassungsgruppen in regulären Ausdrücken ist jetzt standardmäßig aktiviert.

const pattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u;
const result = pattern.exec('2017-12-15');
// result.groups.year === '2017'
// result.groups.month === '12'
// result.groups.day === '15'

Weitere Details zu diesen Funktionen finden Sie in unserem Blogbeitrag mit dem Titel Kommende Funktionen für reguläre Ausdrücke.

Dank Groupon implementiert V8 jetzt import.meta, was es Embettern ermöglicht, host-spezifische Metadaten zum aktuellen Modul offenzulegen. Chrome 64 zeigt beispielsweise die Modul-URL über import.meta.url an, und Chrome plant, in Zukunft weitere Eigenschaften zu import.meta hinzuzufügen.

Zur Unterstützung der lokalbewussten Formatierung von Zeichenfolgen, die von Internationalisierungsformatierern erzeugt werden, können Entwickler jetzt Intl.NumberFormat.prototype.formatToParts() verwenden, um eine Zahl in eine Liste von Tokens und deren Typ zu formatieren. Danke an Igalia für die Implementierung dieser Funktion in V8!

V8-API

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

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