gpt4 book ai didi

javascript - NodeJs 比 Clojure 快吗?

转载 作者:IT老高 更新时间:2023-10-28 21:57:44 26 4
gpt4 key购买 nike

我刚开始学习 Clojure。我注意到的第一件事是没有循环。没关系,我可以复发。那么让我们看看这个函数(来自 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)))))

为了在 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

然后我开始尝试经典的 fib(在阅读 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

请注意,我在 clojure 中使用 (time (fib 40)) 所以它忽略了 JVM 的启动时间。它们在 MacBook Air(1.86 Ghz Intel Core 2 Duo)上运行。

那么是什么导致 Clojure 在这里变慢?为什么人们会说“Clojure 速度很快”?

在此先感谢您,请不要打火。

最佳答案

(set! *unchecked-math* true)

(defn add-up ^long [^long n]
(loop [n n i 0 sum 0]
(if (< n i)
sum
(recur n (inc i) (+ i sum)))))

(defn fib ^long [^long n]
(if (<= n 1) 1
(+ (fib (dec n)) (fib (- n 2)))))

(comment
;; ~130ms
(dotimes [_ 10]
(time
(add-up 1e8)))

;; ~1180ms
(dotimes [_ 10]
(time
(fib 41)))
)

所有数字来自 2.66ghz i7 Macbook Pro OS X 10.7 JDK 7 64bit

如您所见,Node.js 被打败了。这是 1.3.0 alpha 版本,但如果您知道自己在做什么,您可以在 1.2.0 中实现相同的目标。

在我的机器上,添加 1e8 的 Node.js 0.4.8 约为 990 毫秒,fib 41 约为 7600 毫秒。

            Node.js  | Clojure
|
add-up 990ms | 130ms
|
fib(41) 7600ms | 1180ms

关于javascript - NodeJs 比 Clojure 快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6216888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com