Muito obrigado pelo tempo gasto nesta explicação. Esclareceu minha dúvida e trouxe muito mais conteúdo... Valeu!
Então, acho quer meu método de medição não foi o mais preciso, utilizei o console.time()
e o console.timeEnd()
.
Muito obrigado pelo tempo gasto nesta explicação. Esclareceu minha dúvida e trouxe muito mais conteúdo... Valeu!
Então, acho quer meu método de medição não foi o mais preciso, utilizei o console.time()
e o console.timeEnd()
.
Então, testei assim:
function fatorial(n) {
if (n == 1 || n == 0)
return 1;
return n * fatorial(n - 1);
}
function fatorial_acc(n, acc = 1) {
if (n == 1 || n == 0)
return acc;
return fatorial_acc(n - 1, n * acc);
}
const n = 100;
console.time();
fatorial(n);
console.timeEnd();
console.time();
fatorial_acc(n);
console.timeEnd();
Ele diz que fatorial
é mais lento. Mas se eu inverter a ordem (chamar fatorial_acc
primeiro), ele vai dizer que esse é o mais lento. O primeiro a ser chamado é mais lento, independente da ordem, provavelmente porque no início tem também a inicialização do runtime, warmup do JIT, sabe-se lá mais o que o Node.js deve fazer na carga inicial.
Aliás, se eu fizer algo assim:
for (var i = 0; i < 30; i++) {
console.time();
fatorial_acc(n);
console.timeEnd();
}
Ou seja, chamo a mesma função várias vezes. Mesmo assim, a primeira execução sempre é mais lenta, pelo mesmo motivo. No meu caso, o resultado foi:
default: 0.434ms
default: 0.027ms
default: 0.038ms
... as demais foram abaixo de 0.1ms
E se eu mudar o for
acima para chamar somente fatorial
, o resultado é o mesmo: a primeira é bem mais lenta.
Por isso é melhor usar ferramentas que desconsideram esses fatores externos (como eu fiz com o Benchmark.js, por exemplo).