Il serait très intéressant de documenter les performances associées aux tableaux et aux objets en JavaScript (notamment Google V8). Je ne trouve aucun article complet sur ce sujet sur Internet.
Je comprends que certains objets utilisent des classes comme structure de données sous-jacente. S'il y a beaucoup de propriétés, elles sont parfois traitées comme une table de hachage ?
Je comprends également que les tableaux sont parfois traités comme des tableaux C++ (c'est-à-dire indexation aléatoire rapide, suppression et redimensionnement lents). Et, d'autres fois, ils sont traités davantage comme des objets (indexation rapide, insertion/suppression rapide, plus de mémoire). Et, parfois, ils sont stockés comme des listes liées (c'est-à-dire indexation aléatoire lente, suppression/insertion rapide au début/à la fin).
Quelles sont les performances précises des récupérations et des manipulations de tableaux/objets en JavaScript ? (spécifiquement pour Google V8)
Plus précisément, quel est l'impact sur les performances de :
- Ajout d'une propriété à un objet
- Suppression d'une propriété d'un objet
- Indexation d'une propriété dans un objet
- Ajout d'un élément à un tableau
- Suppression d'un élément d'un tableau
- Indexer un élément dans un tableau
- Appel de Array.pop()
- Appel de Array.push()
- Appel de Array.shift()
- Appel de Array.unshift()
- Appel de Array.slice()
Tout article ou lien pour plus de détails serait également apprécié :)
EDIT : Je me demande vraiment comment les tableaux et les objets JavaScript fonctionnent sous le capot. De plus, dans quel contexte Le moteur V8 "sait-il" qu'il faut "passer" à une autre structure de données ?
Par exemple, supposons que je crée un tableau avec...
var arr = [];
arr[10000000] = 20;
arr.push(21);
Qu'est-ce qui se passe vraiment ici ?
Ou... que dire de ce... ???
var arr = [];
//Add lots of items
for(var i = 0; i < 1000000; i++)
arr[i] = Math.random();
//Now I use it like a queue...
for(var i = 0; i < arr.length; i++)
{
var item = arr[i].shift();
//Do something with item...
}
Pour les tableaux classiques, les performances seraient terribles, alors que si l'on utilise une liste chaînée (LinkedList)... pas si mal.
3 votes
Visitez jsperf.com et créer des cas de test.
2 votes
@RobW Il y a plus en jeu ici que de simples tests peuvent prendre en compte, ce qui nécessite une connaissance du fonctionnement des compilateurs JIT et de ce qui est fait avec les données. Si je trouve un peu de temps, j'ajouterai une réponse, mais j'espère que quelqu'un d'autre aura le temps d'entrer dans le vif du sujet. J'aimerais également laisser ce lien ici.
0 votes
Les choses JIT dont je parle sont des choses comme la "forme" d'un objet, ou les tableaux avec des valeurs indéfinies entre des éléments définis, ainsi que les fonctionnalités de spécialisation de type expérimentées plus récemment... les méthodes spécifiques aux tableaux peuvent dépendre de l'utilisation ainsi que du fait que le prototype a été manipulé ou non. Il n'y a pas de telle chose que de "savoir" passer à un autre type de données AFAIK.
1 votes
Des représentants de Google expliquent le fonctionnement des différents optimiseurs et du système interne. Et comment optimiser pour eux. (pour les jeux !) youtube.com/watch?v=XAqIpGU8ZZk