V8 Veröffentlichung v6.2
Alle sechs Wochen erstellen wir einen neuen Zweig von V8 als Teil unseres Veröffentlichungsprozesses. Jede Version wird direkt vor einem Chrome-Beta-Meilenstein von V8's Git-Master abgezweigt. Heute freuen wir uns, unseren neuesten Branch, V8 Version 6.2, anzukündigen, der bis zur Veröffentlichung in Verbindung mit Chrome 62 Stable in einigen Wochen in der Beta-Phase ist. V8 v6.2 ist vollgepackt mit allerlei Entwicklertools und Funktionen. Dieser Beitrag gibt eine Vorschau auf einige Highlights, um die Veröffentlichung vorwegzunehmen.
Leistungsverbesserungen
Die Leistung von Object#toString
wurde zuvor bereits als potenzieller Engpass identifiziert, da sie oft von beliebten Bibliotheken wie lodash und underscore.js sowie von Frameworks wie AngularJS verwendet wird. Verschiedene Hilfsfunktionen wie _.isPlainObject
, _.isDate
, angular.isArrayBuffer
oder angular.isRegExp
werden häufig in Anwendung- und Bibliothekscode verwendet, um Laufzeittypprüfungen durchzuführen.
Mit der Einführung von ES2015 wurde Object#toString
durch das neue Symbol.toStringTag
-Symbol modifizierbar, was Object#toString
schwergewichtiger und schwierig zu beschleunigen machte. In dieser Version haben wir eine Optimierung portiert, die ursprünglich in der SpiderMonkey JavaScript-Engine implementiert wurde, wodurch die Durchsatzleistung von Object#toString
um den Faktor 6,5× gesteigert wurde.
Dies wirkt sich auch auf den Speedometer-Browser-Benchmark aus, insbesondere auf den AngularJS-Untertest, bei dem wir eine solide Verbesserung von 3% gemessen haben. Lesen Sie den detaillierten Blogbeitrag für weitere Informationen.
Wir haben auch die Leistung von ES2015-Proxies erheblich verbessert, wodurch das Aufrufen eines Proxy-Objekts über someProxy(params)
oder new SomeOtherProxy(params)
um bis zu 5× beschleunigt wurde:
Ähnlich wurde die Leistung des Zugriffs auf eine Eigenschaft eines Proxy-Objekts über someProxy.property
um fast 6,5× verbessert:
Dies ist Teil eines laufenden Praktikums. Bleiben Sie dran für einen detaillierten Blogbeitrag und die endgültigen Ergebnisse.
Wir freuen uns auch bekannt zu geben, dass dank Beiträgen von Peter Wong die Leistung der String#includes
-Funktion gegenüber der vorherigen Version um mehr als 3× verbessert wurde.
Hashcode-Abfragen für interne Hashtabellen wurden deutlich schneller, was zu einer verbesserten Leistung für Map
, Set
, WeakMap
und WeakSet
führt. Ein bevorstehender Blogbeitrag wird diese Optimierung detailliert erklären.
Der Garbage Collector verwendet jetzt einen Parallel Scavenger zur Sammlung der sogenannten Young Generation des Heaps.
Verbesserter Niedrigspeichermodus
In den letzten Veröffentlichungen wurde der Niedrigspeichermodus von V8 optimiert (z. B. durch Festlegen der anfänglichen Semi-Space-Größe auf 512 KB). Geräte mit wenig Speicher stoßen jetzt seltener auf Out-of-Memory-Situationen. Dieses Verhalten bei niedrigem Speicherbedarf könnte jedoch negative Auswirkungen auf die Laufzeitleistung haben.
Weitere reguläre Ausdrucksfunktionen
Die Unterstützung für den dotAll
-Modus für reguläre Ausdrücke, aktiviert durch das s
-Flag, ist jetzt standardmäßig aktiviert. Im dotAll
-Modus stimmt das .
-Atom in regulären Ausdrücken auf jedes Zeichen zu, einschließlich Zeilenumbrüchen.
/foo.bar/su.test('foo\nbar'); // true
Lookbehind Assertions, ein weiteres neues Feature für reguläre Ausdrücke, sind jetzt standardmäßig verfügbar. Der Name beschreibt die Bedeutung bereits ziemlich gut. Lookbehind Assertions bieten eine Möglichkeit, ein Muster so einzuschränken, dass es nur dann übereinstimmt, wenn es von dem Muster in der Lookbehind-Gruppe vorangegangen wird. Sie sind sowohl in übereinstimmenden als auch in nicht übereinstimmenden Varianten verfügbar:
/(?<=\$)\d+/.exec('$1 is worth about ¥123'); // ['1']
/(?<!\$)\d+/.exec('$1 is worth about ¥123'); // ['123']
Weitere Details zu diesen Features finden Sie in unserem Blogbeitrag mit dem Titel Upcoming regular expression features.
Revision der Template-Literals
Die Einschränkung von Escape-Sequenzen in Template-Literals wurde gemäß dem zugrunde liegenden Vorschlag gelockert. Dies ermöglicht neue Anwendungsfälle für Template-Tags, wie das Schreiben eines LaTeX-Prozessors.
const latex = (strings) => {
// …
};
const document = latex`
\newcommand{\fun}{\textbf{Fun!}}
\newcommand{\unicode}{\textbf{Unicode!}}
\newcommand{\xerxes}{\textbf{King!}}
Breve über das h geht \u{h}er // Ungültiges Token!
`;
Erhöhte maximale Zeichenkettenlänge
Die maximale Zeichenkettenlänge auf 64-Bit-Plattformen wurde von 2**28 - 16
auf 2**30 - 25
Zeichen erhöht.
Full-codegen ist weg
In V8 v6.2 sind die letzten großen Teile der alten Pipeline entfernt worden. Mehr als 30.000 Codezeilen wurden in dieser Version gelöscht — ein klarer Gewinn zur Reduzierung der Komplexität des Codes.
V8 API
Bitte sehen Sie sich unsere Zusammenfassung der API-Änderungen an. Dieses Dokument wird regelmäßig ein paar Wochen nach jeder Hauptversion aktualisiert.
Entwickler mit einem aktiven V8 Checkout können git checkout -b 6.2 -t branch-heads/6.2
verwenden, um mit den neuen Funktionen in V8 v6.2 zu experimentieren. Alternativ können Sie Chrome’s Beta-Kanal abonnieren und die neuen Funktionen bald selbst ausprobieren.