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.
Olá k, até posso compartilhar mas o trecho nao fará sentido algum sem todo o contexto que ele se encontra, aqui está a parte que mensurei no post, foi por volta desse promise all:
await Promise.all(
proposals.map(async (proposal) => {
// Taxa
if (proposal.proposalTax.length) {
chargeIds.push({
pagarMeChargeId: proposal.proposalTax[0].pagarMeChargeId,
pagarMeUsed: proposal.proposalTax[0].pagarMeUsed,
})
}
// PropostaPayments
const proposalPayments = await ProposalPayments.query()
.preload('proposalBoletoParcelado')
.where('proposal_id', proposal.$attributes.id)
.andWhereNotNull('pagar_me_order_id')
if (proposalPayments && proposalPayments.length) {
await Promise.all(
proposalPayments.map(async (pp) => {
// Boleto Parcelado
if (pp.proposalBoletoParcelado && pp.proposalBoletoParcelado.length) {
await Promise.all(
pp.proposalBoletoParcelado.map((proposalBoletoParcelado) => {
chargeIds.push({
pagarMeChargeId: proposalBoletoParcelado.pagarMeChargeId,
pagarMeUsed: proposalBoletoParcelado.pagarMeUsed,
})
})
)
}
chargeIds.push({
pagarMeChargeId: pp.pagarMeChargeId!,
pagarMeUsed: proposal.pagarMeUsed,
})
})
)
}
// PropostaPayments
const proposalCardMemberships = await ProposalCardMemberships.query()
.preload('proposalCardCycles')
.where('proposal_id', proposal.$attributes.id)
if (proposalCardMemberships && proposalCardMemberships.length) {
await Promise.all(
proposalCardMemberships.map(async (pcm) => {
// Ciclos
if (pcm.proposalCardCycles && pcm.proposalCardCycles.length) {
await Promise.all(
pcm.proposalCardCycles.map((pcc) => {
if (!pcc.pagarMeChargeId) return
chargeIds.push({
pagarMeChargeId: pcc.pagarMeChargeId,
pagarMeUsed: pcm.pagarMeUsed,
})
})
)
}
})
)
}
})
)
Estou esperando um tempo livre para tentar reproduzi-lo e em breve posto aqui minhas conclusoes.
de cara no ultimo teste que fiz, tive resultados negativos quanto ao promisse.all()
.
import { createServer } from 'node:http'
import { performance } from 'node:perf_hooks'
const app = createServer()
app.on("request", async (_, response) => {
const casas = Array(100).fill({
pessoas: Array(100).fill({
bicicletas: Array(100).fill({
cor: ""
})
})
})
const map = () => {
let list = []
performance.mark("mapStart")
casas.map(casa => casa.pessoas.map(pessoa => pessoa.bicicletas.map(bicicleta => list.push(bicicleta.cor))))
performance.mark("mapEnd")
performance.measure("map", "mapStart", "mapEnd")
}
const forof = () => {
let list = []
performance.mark("forofStart")
for (const casa of casas) {
for (const pessoa of casa.pessoas) {
for (const bicicleta of pessoa.bicicletas) {
list.push(bicicleta.cor)
}
}
}
performance.mark("forofEnd")
performance.measure("forof", "forofStart", "forofEnd")
}
const all = async () => {
let list = []
performance.mark("allStart")
await Promise.all(
casas.map(async casa => {
await Promise.all(
casa.pessoas.map(async pessoa => {
await Promise.all(
pessoa.bicicletas.map(bicicleta => list.push(bicicleta.cor))
)
})
)
})
)
performance.mark("allEnd")
performance.measure("all", "allStart", "allEnd")
}
map()
forof()
await all()
console.log(performance.getEntriesByType("measure"))
response.end("ok")
})
app.listen(3333)
resultados:
[ PerformanceMeasure { name: 'map', entryType: 'measure', startTime: 3310.392207, duration: 33.59345100000019 }, PerformanceMeasure { name: 'forof', entryType: 'measure', startTime: 3344.32724, duration: 29.174007000000074 }, PerformanceMeasure { name: 'all', entryType: 'measure', startTime: 3373.629408, duration: 302.93898400000035 } ]