[Javascript] o map() mais performatico que for...of.
Em dado momento da minha profissinal de programador, vi uma materia afirmando e comprovando que um for...of
é mais performatico que um map()
, e se eu te diser que da pra fazer um map()
ser mais performatico que um for...of
, você sabe me dizer como? Deixa eu te contar uma historia.
Hoje resolvendo minha task de cada dia, me deparei com um codigo de outro dev que a principio achei bizarro, aparentemente era nescessario rodar map()
dentro de map()
dentro de map()
, ate então ok, não queria mexer ali e talvez encontrar um boss lvl99, mas olhando um pouco mais o estranho era que nem todo map()
era assincrono e mesmo assim ele usava await Promise.all([].map())
, pensando totalmente dentro da caixa critiquei pra caramba e refatorei usando for...of
em seguida fiz uma teste usando console.time() & console.timeEnd()
obtendo uma media de ~250ms, orgulhoso do resultado guardei o codigo refatorado e rodei varios ctrl + Z para voltar ao codigo original e fazer o mesmo teste de performace e me surpreendi com o um resultado melhor de ~130ms, totalmente descrente, achei que tinha feito algo de errado em minha refatoração mas saindo da caixinha e olhando para o lado teórico do assunto, sabemos que o Promise.all()
vai executar cada loop de um map em simultaneo, diferente do for...of
que irá executar um loop após o termino do outro, dessa forma, nosso map()
acaba sendo mais performatico que o for...of
.
Quem diria em amigos, a gente cria nossos proprios padroes de codigo e as vezes olhamos para outras formas de resolver e achamos a coisa mais bizarra do mundo, afinal por que bulhunfas eu iria usar um Promise.all()
para uma coisa nao assincrona rsrsrs, ja pensou se eu simplesmente refatoro sem comprovar os resultados teria dado um downgrade no metodo rsrsrs.
Oque acharam? pega leve é meu primeiro post.
O post ficou incrível!
Falou de uma experiência real de algo comum, tambem já sofri com isso kkkk
Uma coisa é que você consegue usar o Promise.all()
com um .map()
e não com um .filter()
aparentemente, levei um bom tempo pra descobrir kkkkkk
Só senti um pouco de falta em exemplos de código e formatação no texto, tirando isso, o conteúdo ta fantástico!
Vc pode compartilhar o código completo? Ou pelo menos algum exemplo reduzido que dê o mesmo resultado. Porque sem isso não tem como analisar o que está fazendo com que um seja mais rápido que outro, nem o que de fato está sendo comparado.
Em geral, um for
costuma ser mais rápido que um map
/forEach
/filter
/reduce
, já que estes métodos recebem uma função de callback que é executada para cada elemento (embora a diferença seja imperceptível para arrays pequenos, ainda sim tem o custo de chamar a função várias vezes, que dependendo do caso não pode ser desprezado). Mas cada caso é um caso, e se entram operações assíncronas no meio, tudo pode mudar dependendo do que é feito e como as operações são executadas.
Vale lembrar também que console.time
não é a maneira mais confiável de comparar tempos de execução, como já explicado aqui.
Interessante.
E se fosse algo assim?
Promise.all(() => { for(const e of array) {} })
O map retorna um array pra dentro do Promise.all(). O map não espera nada nem ninguém, vai lá e faz e retona o array pra dentro do Promise.all().
const arr = [].map()
Promise.all(arr)
Daria quase na mesma claro que ter uma variavel muda a velocidade!
For of é mais lento por usar iteradores por debaixo dos panos e toda a sobrecarga que vem com eles.
https://chromium.googlesource.com/v8/v8.git/+/3.31.25/src/array-iterator.js?autodive=0%2F%2F
Quer rapidez use o for velho de guerra!
for (let i = 0; i < arr.length; i++)