Tamam, hem bir diziden hem de bir kümeden öğe eklemeyi, yinelemeyi ve kaldırmayı test ettim. 10.000 öğe kullanarak "küçük" bir test ve 100.000 öğe kullanarak "büyük" bir test yaptım. Sonuçlar burada.
Bir koleksiyona öğe ekleme
Görünüşe .push
göre, .add
eklenen eleman sayısı ne olursa olsun dizi yöntemi set yönteminden yaklaşık 4 kat daha hızlıdır .
Bir koleksiyondaki öğeleri yineleme ve değiştirme
Testin bu kısmı for
için dizi üzerinde yinelemek için bir for of
döngü ve set üzerinde yinelemek için bir döngü kullandım. Yine, dizi üzerinde yineleme daha hızlıydı. Bu sefer, "küçük" testlerde iki kat daha uzun sürdüğü ve "büyük" testlerde neredeyse dört kat daha uzun sürdüğü için katlanarak olduğu görülüyor.
Bir koleksiyondan öğeleri kaldırma
Şimdi ilginçleşen yer burası. Bir for
döngü kombinasyonu .splice
kullandım for of
ve diziden .delete
bazı elemanları kaldırmak için kullandım ve bazı elemanları setten kaldırdım. "Küçük" testler için, öğeleri setten çıkarmak yaklaşık üç kat daha hızlıydı (2,6 ms - 7,1 ms), ancak yalnızca diziden öğeleri kaldırmanın 1955,1 ms sürdüğü "büyük" test için işler büyük ölçüde değişti Bunları setten çıkarmak 83,6 ms sürdü, 23 kat daha hızlı.
Sonuçlar
10k öğelerde, her iki test de karşılaştırılabilir sürelerde çalıştı (dizi: 16,6 ms, set: 20,7 ms), ancak 100k öğelerle uğraşırken, küme açık kazanan oldu (dizi: 1974,8 ms, küme: 83,6 ms), ancak yalnızca kaldırma nedeniyle operasyon. Aksi takdirde dizi daha hızlıydı. Bunun tam olarak neden olduğunu söyleyemedim.
Bir dizinin oluşturulduğu ve doldurulduğu ve daha sonra bazı öğelerin kaldırılacağı bir kümeye dönüştürüldüğü bazı karma senaryolarla oynadım, set daha sonra bir diziye dönüştürülürdü. Bunu yapmak, dizideki öğeleri kaldırmaktan çok daha iyi bir performans sağlayacak olsa da, bir kümeye ve bir kümeden aktarım için gereken ek işlem süresi, bir dizi yerine diziyi doldurmanın kazançlarından daha ağır basar. Sonunda, sadece bir setle uğraşmak daha hızlıdır. Yine de, bir diziyi, yinelenenleri olmayan bazı büyük veriler için veri koleksiyonu olarak kullanmayı seçerseniz, bir arada birçok öğeyi kaldırmaya ihtiyaç duyulursa, performans açısından avantajlı olabilir. işlem, diziyi bir kümeye dönüştürmek, kaldırma işlemini gerçekleştirmek ve kümeyi yeniden diziye dönüştürmek için.
Dizi kodu:
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.")
Kodu ayarla:
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.")