我刚开始学习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)))))
Run Code Online (Sandbox Code Playgroud)
要在Javascript中实现相同的功能,我们使用如下循环:
function addup (n) {
var sum = 0;
for(var i = n; i > 0; i--) {
sum += i;
}
return sum;
}
Run Code Online (Sandbox Code Playgroud)
定时时,结果如下:
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: …Run Code Online (Sandbox Code Playgroud) 我想做一些实时图形渲染,并尝试每帧每像素进行多次计算.然后我很快发现这很慢并且从最基础开始:我可以多快地遍历所有像素?
我发现dotimes的速度相当快,但是当我在REPL中执行此操作时,速度非常慢:
user=> (dotimes [_ 10] (time (dotimes [_ 1e7] (+ 1 1))))
"Elapsed time: 409.177477 msecs"
"Elapsed time: 417.755502 msecs"
"Elapsed time: 418.939182 msecs"
"Elapsed time: 420.131575 msecs"
"Elapsed time: 419.83529 msecs"
"Elapsed time: 417.612003 msecs"
"Elapsed time: 420.749229 msecs"
"Elapsed time: 418.918554 msecs"
"Elapsed time: 414.403957 msecs"
"Elapsed time: 417.729624 msecs"
nil
user=>
Run Code Online (Sandbox Code Playgroud)
然后我把它放到Leiningen项目中.当我做"lein run"时,它同样缓慢.但是当我创建uberjar并使用java命令运行它时,速度要快得多:
% java -jar target/looping-0.1.0-SNAPSHOT-standalone.jar
"Elapsed time: 122.006758 msecs"
"Elapsed time: 3.667653 msecs"
"Elapsed time: 3.60515 msecs"
"Elapsed time: 4.008436 msecs"
"Elapsed time: 3.961558 …Run Code Online (Sandbox Code Playgroud)