Sortie de V8 v7.2
Toutes les six semaines, nous créons une nouvelle branche de V8 dans le cadre de notre processus de sortie. Chaque version est dérivée de la branche principale Git de V8 immédiatement avant une version Beta de Chrome. Aujourd'hui, nous sommes ravis d'annoncer notre dernière branche, V8 version 7.2, actuellement en beta, en attendant sa sortie en coordination avec la version stable de Chrome 72 dans quelques semaines. V8 v7.2 regorge de fonctionnalités pour les développeurs. Cet article fournit un aperçu de quelques points forts en prévision de la sortie.
Mémoire
Les exécutions intégrées sont désormais prises en charge et activées par défaut sur l'architecture ia32.
Performance
Parsing JavaScript
En moyenne, les pages web passent 9,5% du temps de V8 au démarrage sur le parsing JavaScript. Par conséquent, nous nous sommes concentrés sur le déploiement du parser JavaScript le plus rapide jamais vu avec la version 7.2. Nous avons considérablement amélioré la vitesse de parsing sur toute la ligne. Depuis la v7.0, la vitesse de parsing a augmenté d'environ 30% sur les ordinateurs de bureau. Le graphique suivant montre les améliorations impressionnantes sur notre benchmark de chargement réel de Facebook au cours des derniers mois.
Nous nous sommes concentrés à plusieurs reprises sur le parser. Les graphiques suivants montrent les améliorations relatives à la dernière version v7.2 sur plusieurs sites web populaires.
Dans l'ensemble, les améliorations récentes ont réduit le pourcentage moyen de parsing de 9,5% à 7,5%, ce qui se traduit par des temps de chargement plus rapides et des pages plus réactives.
async
/await
V8 v7.2 est livré avec une implémentation plus rapide de async
/await
, activée par défaut. Nous avons fait une proposition de spécification et sommes actuellement en train de collecter des données de compatibilité web pour que le changement soit officiellement fusionné dans la spécification ECMAScript.
Éléments de spread
V8 v7.2 améliore grandement les performances des éléments de spread lorsqu'ils apparaissent au début d'un littéral de tableau, par exemple [...x]
ou [...x, 1, 2]
. L'amélioration s'applique au spreading des tableaux, chaînes primitives, ensembles, clés de map, valeurs de map, et — par extension — à Array.from(x)
. Pour plus de détails, consultez notre article approfondi sur l'accélération des éléments de spread.
WebAssembly
Nous avons analysé un certain nombre de benchmarks WebAssembly et les avons utilisés pour guider une génération de code améliorée dans le niveau d'exécution supérieur. En particulier, la version 7.2 de V8 permet le découpage des nœuds dans le planificateur du compilateur optimisant et la rotation des boucles dans le backend. Nous avons également amélioré la mise en cache des wrappers et introduit des wrappers personnalisés qui réduisent la surcharge lors des appels aux fonctions mathématiques JavaScript importées. De plus, nous avons conçu des modifications pour l'allocation des registres qui améliorent les performances pour de nombreux modèles de code qui seront intégrés dans une version ultérieure.
Gestionnaires de pièges
Les gestionnaires de pièges améliorent le débit général du code WebAssembly. Ils sont implémentés et disponibles sur Windows, macOS et Linux dans V8 v7.2. Dans Chromium, ils sont activés sur Linux. Windows et macOS suivront lorsque la stabilité sera confirmée. Nous travaillons également à les rendre disponibles sur Android.
Traces de pile avec async
Comme mentionné précédemment, nous avons ajouté une nouvelle fonctionnalité appelée traces de pile asynchrones sans coût, qui enrichit la propriété error.stack
avec des cadres d'appel asynchrones. Elle est actuellement disponible derrière l'indicateur de ligne de commande --async-stack-traces
.
Fonctionnalités du langage JavaScript
Champs de classe publics
V8 v7.2 ajoute la prise en charge des champs de classe publics. Au lieu de:
class Animal {
constructor(name) {
this.name = name;
}
}
class Cat extends Animal {
constructor(name) {
super(name);
this.likesBaths = false;
}
meow() {
console.log('Meow!');
}
}
…vous pouvez maintenant écrire :
class Animal {
constructor(name) {
this.name = name;
}
}
class Cat extends Animal {
likesBaths = false;
meow() {
console.log('Meow!');
}
}
La prise en charge des champs de classe privés est prévue dans une future version de V8.
Intl.ListFormat
V8 v7.2 ajoute la prise en charge de la proposition Intl.ListFormat
, permettant le formatage localisé des listes.
const lf = new Intl.ListFormat('en');
lf.format(['Frank']);
// → 'Frank'
lf.format(['Frank', 'Christine']);
// → 'Frank et Christine'
lf.format(['Frank', 'Christine', 'Flora']);
// → 'Frank, Christine et Flora'
lf.format(['Frank', 'Christine', 'Flora', 'Harrison']);
// → 'Frank, Christine, Flora et Harrison'
Pour plus d'informations et des exemples d'utilisation, consultez notre guide sur Intl.ListFormat
.
JSON.stringify
bien formé
JSON.stringify
génère désormais des séquences d'échappement pour les substituts isolés, rendant sa sortie en Unicode valide (et représentable en UTF-8) :
// Ancien comportement :
JSON.stringify('\uD800');
// → '"�"'
// Nouveau comportement :
JSON.stringify('\uD800');
// → '"\\ud800"'
Pour plus d'informations, consultez notre guide sur JSON.stringify
bien formé.
Exportations d'espaces de noms de module
Dans les modules JavaScript, il était déjà possible d'utiliser la syntaxe suivante :
import * as utils from './utils.mjs';
Cependant, aucune syntaxe export
symétrique n'existait… jusqu'à maintenant :
export * as utils from './utils.mjs';
Cela équivaut à ce qui suit :
import * as utils from './utils.mjs';
export { utils };
API V8
Veuillez utiliser git log branch-heads/7.1..branch-heads/7.2 include/v8.h
pour obtenir une liste des modifications de l'API.
Les développeurs disposant d'un dépôt actif de V8 peuvent utiliser git checkout -b 7.2 -t branch-heads/7.2
pour expérimenter les nouvelles fonctionnalités de V8 v7.2. Alternativement, vous pouvez vous abonner au canal Beta de Chrome et essayer bientôt les nouvelles fonctionnalités par vous-même.