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.

questionAnswers(7)

yourAnswerToTheQuestion