Executando verificação de segurança...
2

[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

Carregando publicação patrocinada...
3

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.

1

Gostei da resposta. Deu pra dar uma clearada grande.

Foi erro meu na hora de passar o código pro tabnews, acabei esquecendo de incluir o meuFilter, mas não tem segredo, é uma implementação bem básica:

Array.prototype.meuFilter = function (callback) {
  const novoArray = [];

  for (let item of this) {
    if (callback(item, this)) novoArray.push(item);
  }

  return novoArray;
};

Obrigado pela resposta.

1

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!

1
1

Até onde sei, as engines não fazem memoização por default. Geralmente é algo que vc faz à parte, já que a engine em si não tem como garantir que a função é pura (sem efeitos colaterais), pois aí memoização não é indicado.

Tem que ver também o tamanho do array e os valores que ele contém, pode ter influência no resultado (para poucos dados, costuma ter mais distorções que desaparecem em datasets maiores).

É verdade que muitas engines usam alguma forma de JIT que pode fazer inline de funções e acelerar o processo. Mas isso só costuma acontecer se for executado muitas vezes, então se o array for pequeno, o efeito é mínimo ou até mesmo nulo.

Ou seja, meu palpite é que isso não seja a principal causa da diferença. Sugiro testar com o Benchmark.js ou outra lib similar, para ter resultados mais "limpos" que console.time.

1

Não me refutou, o que você disse não muda o que eu disse em nada, nem uma virgula!

Cada runtime e engine tem suas particularidades e foi isso que eu disse pra ele!

1

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.

-2

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

1

Entendi, entendi.

Ainda não sei muita coisa além do básico sobre o eventLoop.
Na realidade, apenas sei que ele existe kkkkkk

Vou estudar mais sobre ele