【发布时间】:2014-07-28 22:34:43
【问题描述】:
Here 清楚地解释了如何优化处理原始值的 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 代码示例中缺少什么?为什么这么慢(理论上应该是差不多的速度)?
【问题讨论】:
标签: java performance scala clojure