Lancement de V8 v9.3
Toutes les six semaines, nous créons une nouvelle branche de V8 dans le cadre de notre processus de publication. Chaque version est dérivée de la branche principale de V8 juste avant une étape bêta de Chrome. Aujourd'hui, nous sommes ravis d'annoncer notre toute nouvelle branche, V8 version 9.3, qui est en bêta jusqu'à sa publication en coordination avec Chrome 93 Stable dans plusieurs semaines. V8 v9.3 est remplie de nouveautés intéressantes pour les développeurs. Cet article offre un aperçu de certaines des principales nouveautés en prévision de la sortie.
JavaScript
Compilation par lots Sparkplug
Nous avons lancé notre nouveau compilateur JIT de milieu de gamme ultra rapide Sparkplug dans la version 9.1. Pour des raisons de sécurité, V8 protège en écriture la mémoire du code qu'il génère, nécessitant de basculer les permissions entre écriture (pendant la compilation) et exécution. Cela est actuellement implémenté via des appels mprotect
. Cependant, comme Sparkplug génère du code très rapidement, le coût d'appel de mprotect
pour chaque fonction compilée individuellement est devenu un goulet d'étranglement majeur dans le temps de compilation. Dans V8 v9.3, nous introduisons la compilation par lots pour Sparkplug : au lieu de compiler chaque fonction individuellement, nous compilons plusieurs fonctions en lot. Cela amortit le coût du basculement des permissions des pages mémoire en ne le faisant qu'une seule fois par lot.
La compilation par lots réduit le temps global de compilation (Ignition + Sparkplug) jusqu'à 44 % sans régresser l'exécution du JavaScript. Si nous ne considérons que le coût de compilation du code Sparkplug, l'impact est évidemment plus important, par exemple une réduction de 82 % pour le benchmark docs_scrolling
(voir ci-dessous) sur Windows 10. Étonnamment, la compilation par lots a amélioré les performances de compilation encore plus que le coût de W^X, puisque regrouper des opérations similaires est généralement mieux pour le CPU. Sur le graphique ci-dessous, vous pouvez voir l'impact de W^X sur le temps de compilation (Ignition + Sparkplug), et comment la compilation par lots a bien atténué cet overhead.
Object.hasOwn
Object.hasOwn
est un alias plus accessible pour Object.prototype.hasOwnProperty.call
.
Par exemple :
Object.hasOwn({ prop: 42 }, 'prop')
// → true
Un petit peu plus de détails (mais pas beaucoup !) sont disponibles dans notre explication de la fonctionnalité.
Cause d'erreur
À partir de la version 9.3, les différents constructeurs d'erreurs intégrés acceptent une structure d'options avec une propriété cause
pour le deuxième paramètre. Si une telle structure d'options est passée, la valeur de la propriété cause
est installée comme une propriété propre sur l'instance d'Error. Cela fournit un moyen standardisé d'enchaîner les erreurs.
Par exemple :
const parentError = new Error('parent');
const error = new Error('parent', { cause: parentError });
console.log(error.cause === parentError);
// → true
Comme toujours, veuillez consulter notre explication plus approfondie de la fonctionnalité.
Atténuations du code non fiable désactivées sur Android
Il y a trois ans, nous avons introduit un ensemble d'atténuations de génération de code pour nous défendre contre les attaques Spectre. Nous avons toujours su qu'il s'agissait d'une solution provisoire qui ne fournissait qu'une protection partielle contre les attaques Spectre. La seule protection efficace est d'isoler les sites Web via l'isolement des sites. L'isolement des sites a été activé sur Chrome sur les appareils de bureau depuis un certain temps, mais activer l'isolement complet des sites sur Android a été plus difficile en raison des contraintes de ressources. Cependant, à partir de Chrome 92, l'Isolement des sites sur Android a été activé sur de nombreux sites contenant des données sensibles.
Ainsi, nous avons décidé de désactiver les atténuations de génération de code de V8 pour Spectre sur Android. Ces atténuations sont moins efficaces que l'Isolement des sites et entraînent un coût de performance. Les désactiver met Android sur un pied d'égalité avec les plateformes de bureau, où elles ont été désactivées depuis V8 v7.0. En désactivant ces atténuations, nous avons observé des améliorations significatives des performances lors des benchmarks sur Android.
API V8
Veuillez utiliser git log branch-heads/9.2..branch-heads/9.3 include/v8.h
pour obtenir une liste des changements d'API.