Хорошо, я протестировал добавление, повторение и удаление элементов как из массива, так и из набора. Я провел «маленький» тест, используя 10 000 элементов, и «большой» тест, используя 100 000 элементов. Вот результаты.
Добавление элементов в коллекцию
Казалось бы, .push
метод массива примерно в 4 раза быстрее, чем .add
метод set, независимо от количества добавляемых элементов.
Итерация и изменение элементов в коллекции
В этой части теста я использовал for
цикл для итерации по массиву и for of
цикл для итерации по набору. Опять же, итерация по массиву была быстрее. На этот раз, казалось бы, экспоненциально, так как на «малых» тестах потребовалось вдвое больше времени, а на «больших» - почти в четыре раза больше.
Удаление элементов из коллекции
А теперь самое интересное. Я использовал комбинацию for
цикла и .splice
для удаления некоторых элементов из массива, и я использовал for of
и .delete
для удаления некоторых элементов из набора. Для «малых» тестов удаление элементов из набора было примерно в три раза быстрее (2,6 мс против 7,1 мс), но все резко изменилось для «большого» теста, где на удаление элементов из массива потребовалось 1955,1 мс, в то время как он только На их удаление из набора потребовалось 83,6 мс, в 23 раза быстрее.
Выводы
При 10 тыс. Элементов оба теста прошли сравнимое время (массив: 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.")