Ok, eu testei adicionar, iterar e remover elementos de uma matriz e de um conjunto. Fiz um teste "pequeno", usando 10.000 elementos e um teste "grande", usando 100.000 elementos. Aqui estão os resultados.
Adicionar elementos a uma coleção
Parece que o .push
método array é cerca de 4 vezes mais rápido do que o .add
método set, não importa o número de elementos sendo adicionados.
Iterando e modificando elementos em uma coleção
Para esta parte do teste, usei um for
loop para iterar no array e um for of
loop para iterar no conjunto. Novamente, a iteração no array foi mais rápida. Desta vez, parece que é exponencialmente, pois demorava o dobro durante os testes "pequenos" e quase quatro vezes mais durante os testes "grandes".
Remover elementos de uma coleção
Agora é aqui que fica interessante. Usei uma combinação de um for
loop e .splice
para remover alguns elementos do array e usei for of
e .delete
para remover alguns elementos do conjunto. Para os testes "pequenos", era cerca de três vezes mais rápido remover itens do conjunto (2,6 ms vs 7,1 ms), mas as coisas mudaram drasticamente para o teste "grande", em que demorou 1955,1 ms para remover itens do array enquanto ele apenas levou 83,6 ms para removê-los do conjunto, 23 vezes mais rápido.
Conclusões
Em 10k elementos, ambos os testes foram executados em tempos comparáveis (matriz: 16,6 ms, conjunto: 20,7 ms), mas ao lidar com 100 mil elementos, o conjunto foi o vencedor claro (matriz: 1974,8 ms, conjunto: 83,6 ms), mas apenas por causa da remoção Operação. Caso contrário, a matriz foi mais rápida. Eu não poderia dizer exatamente por que isso acontece.
Eu brinquei com alguns cenários híbridos onde um array foi criado e preenchido e então convertido em um conjunto onde alguns elementos seriam removidos, o conjunto seria então reconvertido em um array. Embora isso proporcione um desempenho muito melhor do que remover elementos do array, o tempo de processamento adicional necessário para transferir de e para um conjunto supera os ganhos de preencher um array em vez de um conjunto. No final, é mais rápido lidar apenas com um conjunto. Ainda assim, é uma ideia interessante, que se alguém escolher usar um array como uma coleção de dados para algum big data que não tem duplicatas, pode ser vantajoso em termos de desempenho, se houver necessidade de remover muitos elementos em um operação, para converter a matriz em um conjunto, realizar a operação de remoção e converter o conjunto de volta em uma matriz.
Código de 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.")
Definir código:
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.")