Является ли NodeJs быстрее, чем Clojure?

Я только начал изучать Clojure. Одна из первых вещей, которую я заметил, это отсутствие циклов. Это нормально, я может повторяться. Итак, давайте посмотрим на эту функцию (из Практического 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)))))

Для достижения той же функции в Javascript мы используем такой цикл:

function addup (n) {
  var sum = 0;
  for(var i = n; i > 0; i--) {
    sum += i;
  }
  return sum;
}

По времени результаты выглядят так:

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

Затем я продолжил чтобы попробовать классическую фибру (после прочтения this ):

в clojure:

(defn fib
  "Fib"
  [n]
  (if (<= n 1) 1
      (+ (fib (- n 1)) (fib (- n 2)))))

в js:

function fib (n) {
  if (n <= 1) return 1;
  return fib(n-1) + fib(n-2);
}

Опять же, производительность немного отличается.

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

Обратите внимание, я использую time (fib 40)) в clojure, поэтому он игнорирует время загрузки для JVM. Они работают на MacBook Air (1,86 ГГц Intel Core 2 Duo).

Так что же заставляет Clojure работать медленно? И почему люди говорят что «Clojure работает быстро»?

Заранее спасибо и, пожалуйста, никаких пламенных войн.

31
задан foobar 2 June 2011 в 15:47
поделиться