s NodeJs são mais rápidos que o Clojur
Acabei de começar a aprender Clojure. Uma das primeiras coisas que notei é que não há loops. Tudo bem, eu posso recorrer. Então, vejamos esta função (do Practical Clojure):
(defn add-up
"Adds up numbers from 1 to n"
([n] (add-up n 0 0))
([n i sum]
(if (< n i)
sum
(recur n (+ 1 i) (+ i sum)))))
Para obter a mesma função em Javascript, usamos um loop da seguinte forma:
function addup (n) {
var sum = 0;
for(var i = n; i > 0; i--) {
sum += i;
}
return sum;
}
Quando cronometrado, os resultados se parecem com:
input size: 10,000,000
clojure: 818 ms
nodejs: 160 ms
input size: 55,000,000
clojure: 4051 ms
nodejs: 754 ms
input size: 100,000,000
clojure: 7390 ms
nodejs: 1351 ms
Eu comecei a experimentar o clássico fib (depois de lerist):
in clojure:
(defn fib
"Fib"
[n]
(if (<= n 1) 1
(+ (fib (- n 1)) (fib (- n 2)))))
in js:
function fib (n) {
if (n <= 1) return 1;
return fib(n-1) + fib(n-2);
}
Novamente, o desempenho tem alguma diferenç
fib of 39
clojure: 9092 ms
nodejs: 3484 ms
fib of 40
clojure: 14728 ms
nodejs: 5615 ms
fib of 41
clojure: 23611 ms
nodejs: 9079 ms
Nota que estou usando (time (fib 40)) no clojure, portanto, está ignorando o tempo de inicialização da JVM. Eles são executados em um MacBook Air (Intel Core 2 Duo de 1,86 Ghz).
Então, o que está causando o Clojure ser lento aqui? E por que as pessoas dizem que "Clojure é rápido"?
Agradecemos antecipadamente e por favor, sem guerras de chamas.