Here https://stackoverflow.com/questions/6216888/is-nodejs-faster-than-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)))))
所以,出于好奇,我尝试了一下lein repl
令我惊讶的是,发现此代码的运行速度比预期慢约 20 倍(Oracle JDK 1.8.0_11 x64 上的 Clojure 1.6.0):
user=> (time (add-up 1e8))
"Elapsed time: 2719.188432 msecs"
5000000050000000
Scala 2.10.4(相同 JVM)中的等效代码运行时间约为 90 毫秒:
def addup(n: Long) = {
@annotation.tailrec def sum(s: Long, i: Long): Long =
if (i == 0) s else sum(s + i, i - 1)
sum(0, n)
}
那么,Clojure 代码示例中缺少什么?为什么这么慢(理论上应该是差不多的速度)?
基准测试与lein repl
通常是一个坏主意,因为它专门设置非服务器 JVM 设置。直接使用 Clojure JAR,我发现在 OS X 10.9 下运行 JDK 8 的 3.5ghz i7 iMac 上大约需要 40 毫秒。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)