Aller au contenu principal

Version V8 v6.2 publiée

· 6 minutes de lecture
équipe V8

Toutes les six semaines, nous créons une nouvelle branche de V8 dans le cadre de notre processus de publication. Chaque version est déviée du maître Git de V8 juste avant un jalon Chrome Beta. Aujourd'hui, nous sommes ravis d'annoncer notre dernière branche, Version 6.2 de V8, qui est en version bêta jusqu'à sa publication en coordination avec Chrome 62 Stable dans quelques semaines. V8 v6.2 est rempli de toutes sortes de nouveautés à destination des développeurs. Cet article offre un aperçu de certains points forts en anticipation de la publication.

Améliorations de performance

La performance de Object#toString avait déjà été identifiée comme un goulet d'étranglement potentiel, car elle est souvent utilisée par des bibliothèques populaires comme lodash et underscore.js, et des frameworks comme AngularJS. Diverses fonctions utilitaires comme _.isPlainObject, _.isDate, angular.isArrayBuffer ou angular.isRegExp sont souvent utilisées dans le code des applications et des bibliothèques pour effectuer des vérifications de type à l'exécution.

Avec l'avènement de ES2015, Object#toString est devenu patchable à chaud via le nouveau symbole Symbol.toStringTag, ce qui a également rendu Object#toString plus lourd et plus difficile à accélérer. Dans cette version, nous avons porté une optimisation initialement mise en œuvre dans le moteur JavaScript SpiderMonkey à V8, augmentant le débit de Object#toString d'un facteur de 6,5×.

Cela a également un impact sur le benchmark de navigateur Speedometer, en particulier le sous-test AngularJS, où nous avons mesuré une solide amélioration de 3 %. Lisez l'article détaillé pour plus d'informations.

Nous avons également considérablement amélioré la performance des proxies de ES2015, accélérant les appels à un objet proxy via someProxy(params) ou new SomeOtherProxy(params) jusqu'à :

De même, la performance de l'accès à une propriété sur un objet proxy via someProxy.property s'est améliorée de presque 6,5× :

Cela fait partie d'un stage en cours. Restez à l'écoute pour un article plus détaillé et les résultats finaux.

Nous sommes également ravis d'annoncer que grâce aux contributions de Peter Wong, la performance de la fonction intégrée String#includes s'est améliorée de plus de depuis la version précédente.

Les recherches par hachage pour les tables de hachage internes sont devenues beaucoup plus rapides, entraînant une amélioration de la performance pour Map, Set, WeakMap et WeakSet. Un article de blog à venir expliquera cette optimisation en détail.

Le ramasse-miettes utilise désormais un Scavenger parallèle pour collecter la soi-disant jeune génération du tas.

Mode mémoire faible amélioré

Au cours des dernières versions, le mode mémoire faible de V8 a été amélioré (par exemple en réglant la taille initiale de l’espace semi à 512 Ko). Les appareils à faible mémoire rencontrent désormais moins de situations de mémoire insuffisante. Cependant, ce comportement en mémoire faible pourrait avoir un impact négatif sur la performance à l'exécution.

Plus de fonctionnalités pour les expressions régulières

Le support du mode dotAll pour les expressions régulières, activé grâce au drapeau s, est désormais activé par défaut. En mode dotAll, l'atome . dans les expressions régulières correspond à n'importe quel caractère, y compris les terminateurs de ligne.

/foo.bar/su.test('foo\nbar'); // true

Assertions de lookbehind, une autre nouvelle fonctionnalité des expressions régulières, sont désormais disponibles par défaut. Le nom décrit déjà assez bien leur signification. Les assertions de lookbehind offrent une manière de restreindre un motif afin qu'il ne corresponde que s'il est précédé par le motif du groupe de lookbehind. Cela existe sous forme assortie et non assortie :

/(?<=\$)\d+/.exec('$1 vaut environ ¥123'); // ['1']
/(?<!\$)\d+/.exec('$1 vaut environ ¥123'); // ['123']

Plus de détails sur ces fonctionnalités sont disponibles dans notre article de blog intitulé Fonctionnalités futures des expressions régulières.

Révision des littéraux templates

La restriction sur les séquences d'échappement dans les littéraux templates a été assouplie selon la proposition pertinente. Cela permet de nouveaux cas d'utilisation pour les balises templates, comme écrire un processeur LaTeX.

const latex = (strings) => {
// …
};

const document = latex`
\newcommand{\fun}{\textbf{Fun!}}
\newcommand{\unicode}{\textbf{Unicode!}}
\newcommand{\xerxes}{\textbf{Roi!}}
Accent bref sur le h va \u{h}ici // Jeton illégal !
`;

Augmentation de la longueur maximale des chaînes

La longueur maximale des chaînes sur les plateformes 64 bits est passée de 2**28 - 16 à 2**30 - 25 caractères.

Full-codegen est supprimé

Dans V8 v6.2, les derniers composants majeurs de l'ancien pipeline ont disparu. Plus de 30 000 lignes de code ont été supprimées dans cette version — une amélioration claire pour réduire la complexité du code.

API V8

Veuillez consulter notre résumé des changements d'API. Ce document est régulièrement mis à jour quelques semaines après chaque version majeure.

Les développeurs avec un checkout actif de V8 peuvent utiliser git checkout -b 6.2 -t branch-heads/6.2 pour expérimenter les nouvelles fonctionnalités de V8 v6.2. Alternativement, vous pouvez vous abonner au canal Beta de Chrome et essayer bientôt les nouvelles fonctionnalités vous-même.