Oke, saya telah menguji menambahkan, mengulang, dan menghapus elemen dari array dan set. Saya menjalankan tes "kecil", menggunakan 10.000 elemen dan tes "besar", menggunakan 100.000 elemen. Berikut hasilnya.
Menambahkan elemen ke koleksi
Tampaknya .push
metode array sekitar 4 kali lebih cepat daripada .add
metode set, tidak peduli jumlah elemen yang ditambahkan.
Iterasi dan modifikasi elemen dalam koleksi
Untuk bagian pengujian ini saya menggunakan for
loop untuk mengulang array dan for of
loop untuk mengulang set. Sekali lagi, pengulangan array lebih cepat. Kali ini akan terlihat secara eksponensial sehingga memakan waktu dua kali lebih lama selama tes "kecil" dan hampir empat kali lebih lama selama tes "besar".
Menghapus elemen dari koleksi
Sekarang di sinilah menjadi menarik. Saya menggunakan kombinasi for
loop dan .splice
untuk menghapus beberapa elemen dari array dan saya menggunakan for of
dan .delete
untuk menghapus beberapa elemen dari set. Untuk pengujian "kecil", sekitar tiga kali lebih cepat untuk menghapus item dari set (2,6 md vs 7,1 md) tetapi banyak hal berubah secara drastis untuk pengujian "besar" di mana dibutuhkan 1955,1 md untuk menghapus item dari larik sementara itu hanya butuh 83,6 ms untuk menghapusnya dari set, 23 kali lebih cepat.
Kesimpulan
Pada 10k elemen, kedua tes berjalan dengan waktu yang sebanding (array: 16.6 ms, set: 20.7 ms) tetapi ketika berhadapan dengan elemen 100k, set adalah pemenang yang jelas (array: 1974.8 ms, set: 83.6 ms) tetapi hanya karena penghapusan operasi. Jika tidak, susunannya lebih cepat. Saya tidak bisa mengatakan dengan tepat mengapa itu terjadi.
Saya bermain-main dengan beberapa skenario hybrid di mana sebuah array dibuat dan diisi dan kemudian diubah menjadi satu set di mana beberapa elemen akan dihapus, set tersebut kemudian akan diubah kembali menjadi sebuah array. Meskipun melakukan ini akan memberikan kinerja yang jauh lebih baik daripada menghapus elemen dalam larik, waktu pemrosesan tambahan yang diperlukan untuk mentransfer ke dan dari suatu set lebih besar daripada keuntungan dari mengisi larik daripada satu set. Pada akhirnya, lebih cepat hanya menangani satu set. Namun, ini adalah ide yang menarik, bahwa jika seseorang memilih untuk menggunakan array sebagai pengumpulan data untuk beberapa data besar yang tidak memiliki duplikat, itu bisa menjadi kinerja yang menguntungkan, jika ada kebutuhan untuk menghapus banyak elemen dalam satu operasi, untuk mengonversi larik menjadi satu set, melakukan operasi penghapusan, dan mengonversi set kembali menjadi larik.
Kode array:
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.")
Atur kode:
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.")