[DUVIDA] Por que o tempo de execução dessas funções muda dependendo da ordem?
Estou implementando minhas próprias funções map
, filter
, reduce
e acabei percebendo que a função que sempre fica por último no código, sempre será executada mais rápida.
Isso me deixou um pouco curioso.
Por que isso acontece?
Será na maneira em como estou comparando os tempos ou é alguma questão de ambiente?
Exemplo:
const { results } = await obterPessoa("a");
console.time("meu filter");
const familiaLarsMeuFilter = results.meuFilter(
(item) => item.name.toLowerCase().indexOf(`lars`) !== -1
);
console.timeEnd("meu filter");
console.time("filter");
const familiaLarsFilter = results.filter(
(item) =>
item.name.toLowerCase().indexOf(`lars`) !== -1
);
console.timeEnd("filter");
Terei um resultado diferente para cada runtime, mas filter
sempre vai rodar mais rápido que meuFilter
Agora, se eu inverto a ordem, meuFilter
vai rodar mais rápido que filter
.
Espero que possam me ajudar a sanar essa dúvida.
Vou testar algumas coisas com a biblioteca benchmark.js
e quem sabe tentar descobrir alguma coisa.
Obrigado
Sem saber o que meuFilter
faz, é difícil analisar com precisão, mas enfim...
Usar console.time
pode mascarar alguns detalhes, como já informei neste teste que fiz. Sugiro que leia, mas pra resumir:
Existem várias coisas que acontecem antes do seu código começar a efetivamente rodar. Tem a inicialização do runtime, warmup do JIT, sabe-se lá mais o que o Node.js (ou seja lá qual for a engine que vc está usando) deve fazer na carga inicial.
Por isso o primeiro a rodar geralmente fica mais lento. Eu sugiro usar alguma lib específica que elimina esses fatores da medição, como o próprio Benchmark.js que vc mencionou. Tem exemplos dele aqui e aqui.
Cara, refutando um pouco do uriel, e trazendo um pouco sobre como uma linguagem de programação funciona, acredito ser por um cache de:
item.name.toLowerCase().indexOf(`lars`)
Assim como uma aplicação, se você roda cru, o tempo demora mais, mas se essa função já foi executada antes, a linguagem faz uma memoização dos resultados por um certo tempo para melhorar o desempenho e velocidade. Veja, você usa esse trecho na primeira, o código executa e guarda um cache, e na segunda, já tem o resultado que você espera receber!
experimente tornar o array diferente (porem similares) a cada execução, e repita várias vezes a execução para ter um Benchmark mais preciso.
provavelmente o problema irá sumir.
Voc ê sabe como funciona o eventLoop?
O eventLoop do node funciona diferente do eventloop dos navegadores e cada navegador é diferente! Cada implementação tem suas particularidades. Ou seja na especificação do JS só diz que é pra mostrar um resultado. Como esse resultado é gerado pode ser diferente dependendo da plataforma!
Arrays tem otimizações diferentes tbm
é uma salada mesmo! kkkk