Ok, ich habe das Hinzufügen, Iterieren und Entfernen von Elementen aus einem Array und einer Menge getestet. Ich habe einen "kleinen" Test mit 10 000 Elementen und einen "großen" Test mit 100 000 Elementen durchgeführt. Hier sind die Ergebnisse.
Hinzufügen von Elementen zu einer Sammlung
Es scheint, dass die .push
Array-Methode ungefähr viermal schneller ist als die .add
Set-Methode, unabhängig von der Anzahl der hinzugefügten Elemente.
Elemente in einer Sammlung durchlaufen und ändern
Für diesen Teil des Tests habe ich eine for
Schleife verwendet, um über das Array for of
zu iterieren, und eine Schleife, um über die Menge zu iterieren. Wiederum war das Iterieren über das Array schneller. Diesmal scheint es exponentiell zu sein, da es bei den "kleinen" Tests doppelt so lange und bei den "großen" Tests fast viermal länger dauerte.
Elemente aus einer Sammlung entfernen
Hier wird es interessant. Ich habe eine Kombination aus einer for
Schleife verwendet und .splice
einige Elemente aus dem Array entfernt, und ich habe for of
und verwendet.delete
zu entfernen, einige Elemente aus dem Set entfernt. Bei den "kleinen" Tests war es ungefähr dreimal schneller, Elemente aus dem Satz zu entfernen (2,6 ms gegenüber 7,1 ms), aber beim "großen" Test, bei dem 1955,1 ms benötigt wurden, um Elemente aus dem Array zu entfernen, änderten sich die Dinge drastisch Es dauerte 83,6 ms, um sie aus dem Set zu entfernen, 23-mal schneller.
Schlussfolgerungen
Bei 10.000 Elementen liefen beide Tests vergleichbare Zeiten (Array: 16,6 ms, Satz: 20,7 ms), aber bei 100.000 Elementen war der Satz der klare Gewinner (Array: 1974,8 ms, Satz: 83,6 ms), jedoch nur aufgrund des Entfernens Betrieb. Ansonsten war das Array schneller. Ich konnte nicht genau sagen, warum das so ist.
Ich habe mit einigen Hybridszenarien herumgespielt, in denen ein Array erstellt und gefüllt und dann in eine Gruppe konvertiert wurde, in der einige Elemente entfernt wurden. Die Gruppe wurde dann wieder in ein Array konvertiert. Obwohl dies eine viel bessere Leistung bietet als das Entfernen von Elementen im Array, überwiegt die zusätzliche Verarbeitungszeit, die für die Übertragung zu und von einem Satz erforderlich ist, die Vorteile des Auffüllens eines Arrays anstelle eines Satzes. Am Ende ist es schneller, nur mit einem Satz umzugehen. Dennoch ist es eine interessante Idee, dass, wenn man ein Array als Datenerfassung für einige Big Data ohne Duplikate verwendet, dies in Bezug auf die Leistung vorteilhaft sein kann, wenn jemals viele Elemente in einem entfernt werden müssen Operation, um das Array in eine Gruppe zu konvertieren, führen Sie die Entfernungsoperation aus und konvertieren Sie die Gruppe zurück in ein Array.
Array-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++)
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.")
Code einstellen:
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.")