Ok, j'ai testé l'ajout, l'itération et la suppression d'éléments à la fois d'un tableau et d'un ensemble. J'ai fait un "petit" test, utilisant 10 000 éléments et un "grand" test, utilisant 100 000 éléments. Voici les résultats.
Ajouter des éléments à une collection
Il semblerait que la .push
méthode tableau soit environ 4 fois plus rapide que la .add
méthode set, quel que soit le nombre d'éléments ajoutés.
Itérer et modifier des éléments dans une collection
Pour cette partie du test, j'ai utilisé une for
boucle pour parcourir le tableau et une for of
boucle pour parcourir l'ensemble. Encore une fois, l'itération sur le tableau était plus rapide. Cette fois, il semblerait que ce soit de façon exponentielle car cela a pris deux fois plus de temps lors des "petits" tests et presque quatre fois plus lors des "grands" tests.
Supprimer des éléments d'une collection
Maintenant, c'est là que ça devient intéressant. J'ai utilisé une combinaison d'une for
boucle et .splice
pour supprimer certains éléments du tableau et j'ai utilisé for of
et .delete
pour supprimer certains éléments de l'ensemble. Pour les "petits" tests, il était environ trois fois plus rapide de supprimer des éléments de l'ensemble (2,6 ms contre 7,1 ms) mais les choses ont radicalement changé pour le "grand" test où il a fallu 1955,1 ms pour supprimer des éléments du tableau alors qu'il ne s'agissait que de il a fallu 83,6 ms pour les supprimer du plateau, 23 fois plus vite.
Conclusions
À 10k éléments, les deux tests se sont déroulés à des temps comparables (tableau: 16,6 ms, ensemble: 20,7 ms) mais lorsqu'il s'agissait de 100k éléments, l'ensemble était clairement gagnant (tableau: 1974,8 ms, ensemble: 83,6 ms) mais uniquement à cause de la suppression opération. Sinon, le tableau était plus rapide. Je ne pourrais pas dire exactement pourquoi.
J'ai joué avec certains scénarios hybrides où un tableau était créé et peuplé, puis converti en un ensemble où certains éléments seraient supprimés, l'ensemble serait ensuite reconverti en un tableau. Bien que cela donne de bien meilleures performances que la suppression d'éléments dans le tableau, le temps de traitement supplémentaire nécessaire pour transférer vers et depuis un ensemble l'emporte sur les gains de peuplement d'un tableau au lieu d'un ensemble. Au final, il est plus rapide de ne traiter qu'un ensemble. Pourtant, c'est une idée intéressante, que si l'on choisit d'utiliser un tableau comme collection de données pour certaines données volumineuses qui n'ont pas de doublons, cela pourrait être avantageux en termes de performances, s'il est jamais nécessaire de supprimer de nombreux éléments en un seul. , pour convertir le tableau en ensemble, effectuer l'opération de suppression et reconvertir l'ensemble en tableau.
Code de tableau:
var timer = function(name) {
var start = new Date();
return {
stop: function() {
var end = new Date();
var time = end.getTime() - start.getTime();
console.log('Timer:', name, 'finished in', time, 'ms');
}
}
};
var getRandom = function(min, max) {
return Math.random() * (max - min) + min;
};
var lastNames = ['SMITH', 'JOHNSON', 'WILLIAMS', 'JONES', 'BROWN', 'DAVIS', 'MILLER', 'WILSON', 'MOORE', 'TAYLOR', 'ANDERSON', 'THOMAS'];
var genLastName = function() {
var index = Math.round(getRandom(0, lastNames.length - 1));
return lastNames[index];
};
var sex = ["Male", "Female"];
var genSex = function() {
var index = Math.round(getRandom(0, sex.length - 1));
return sex[index];
};
var Person = function() {
this.name = genLastName();
this.age = Math.round(getRandom(0, 100))
this.sex = "Male"
};
var genPersons = function() {
for (var i = 0; i < 100000; i++)
personArray.push(new Person());
};
var changeSex = function() {
for (var i = 0; i < personArray.length; i++) {
personArray[i].sex = genSex();
}
};
var deleteMale = function() {
for (var i = 0; i < personArray.length; i++) {
if (personArray[i].sex === "Male") {
personArray.splice(i, 1)
i--
}
}
};
var t = timer("Array");
var personArray = [];
genPersons();
changeSex();
deleteMale();
t.stop();
console.log("Done! There are " + personArray.length + " persons.")
Définir le code:
var timer = function(name) {
var start = new Date();
return {
stop: function() {
var end = new Date();
var time = end.getTime() - start.getTime();
console.log('Timer:', name, 'finished in', time, 'ms');
}
}
};
var getRandom = function (min, max) {
return Math.random() * (max - min) + min;
};
var lastNames = ['SMITH','JOHNSON','WILLIAMS','JONES','BROWN','DAVIS','MILLER','WILSON','MOORE','TAYLOR','ANDERSON','THOMAS'];
var genLastName = function() {
var index = Math.round(getRandom(0, lastNames.length - 1));
return lastNames[index];
};
var sex = ["Male", "Female"];
var genSex = function() {
var index = Math.round(getRandom(0, sex.length - 1));
return sex[index];
};
var Person = function() {
this.name = genLastName();
this.age = Math.round(getRandom(0,100))
this.sex = "Male"
};
var genPersons = function() {
for (var i = 0; i < 100000; i++)
personSet.add(new Person());
};
var changeSex = function() {
for (var key of personSet) {
key.sex = genSex();
}
};
var deleteMale = function() {
for (var key of personSet) {
if (key.sex === "Male") {
personSet.delete(key)
}
}
};
var t = timer("Set");
var personSet = new Set();
genPersons();
changeSex();
deleteMale();
t.stop();
console.log("Done! There are " + personSet.size + " persons.")
Set
et[]
ou{}
?