Добре, я протестував додавання, ітерацію та видалення елементів як з масиву, так і з набору. Я провів "малий" тест, використовуючи 10 000 елементів, і "великий" тест, використовуючи 100 000 елементів. Ось результати.
Додавання елементів до колекції
Здавалося б, .push
метод масиву приблизно в 4 рази швидший, ніж .add
метод set, незалежно від кількості доданих елементів.
Ітерація та модифікація елементів у колекції
Для цієї частини тесту я використовував for
цикл для ітерації масиву та for of
цикл для ітерації над набором. Знову ж таки, ітерація масиву була швидшою. Цього разу здавалося б, що це експоненційно, так як це зайняло вдвічі більше часу під час «малих» тестів і майже в чотири рази довше під час «великих» тестів.
Видалення елементів із колекції
Зараз тут стає цікаво. Я використовував комбінацію for
циклу і .splice
для видалення деяких елементів з масиву, а також використовував for of
і .delete
для видалення деяких елементів із набору. Для "малих" тестів було приблизно втричі швидше видалити елементи з набору (2,6 мс проти 7,1 мс), але для "великого" тесту ситуація кардинально змінилася, коли для видалення елементів з масиву знадобилося 1955,1 мс, щоб видалити їх із набору, у 23 рази швидше пішло 83,6 мс.
Висновки
Для елементів 10k обидва тести виконувались порівнянно разів (масив: 16,6 мс, набір: 20,7 мс), але при роботі з елементами 100 тис. Набір був явним переможцем (масив: 1974,8 мс, набір: 83,6 мс), але лише через видалення операції. В іншому випадку масив був швидшим. Я не міг точно сказати, чому це так.
Я погрався з деякими гібридними сценаріями, коли масив був створений і заповнений, а потім перетворений у набір, де деякі елементи будуть видалені, а потім набір буде перетворено в масив. Незважаючи на те, що це дасть набагато кращу продуктивність, ніж видалення елементів у масиві, додатковий час обробки, необхідний для передачі в і з набору, перевищує виграші від заповнення масиву замість набору. Зрештою, швидше мати справу лише з набором. Тим не менш, цікавою ідеєю є те, що якщо хтось вирішить використовувати масив як збір даних для деяких великих даних, які не мають дублікатів, це може бути вигідною продуктивністю, якщо коли-небудь буде потрібно видалити багато елементів в одному , щоб перетворити масив у набір, виконати операцію видалення та перетворити набір назад у масив.
Код масиву:
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.")
Встановити код:
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.")