一位朋友在 Clojure 中给了我这段代码片段
(defn sum [coll acc] (if (empty? coll) acc (recur (rest coll) (+ (first coll) acc))))
(time (sum (range 1 9999999) 0))
并问我它与类似的 Scala 实现相比如何。
我编写的 Scala 代码如下所示:
def from(n: Int): Stream[Int] = Stream.cons(n, from(n+1))
val ints = from(1).take(9999998)
def add(a: Stream[Int], b: Long): Long = {
if (a.isEmpty) b else add(a.tail, b + a.head)
}
val t1 = System.currentTimeMillis()
println(add(ints, 0))
val t2 = System.currentTimeMillis()
println((t2 - t1).asInstanceOf[Float] + " msecs")
底线是:Clojure 中的代码在我的机器上运行大约 1.8 秒,使用的堆不到 5MB,Scala 中的代码运行大约 12 秒,512MB 的堆还不够(如果我设置堆到 1GB)。
所以我想知道为什么 Clojure 在这种特殊情况下会更快更苗条?您是否有一个在速度和内存使用方面具有相似行为的 Scala 实现?
请不要发表宗教言论,我的兴趣主要在于找出在这种情况下是什么让 clojure 如此之快,以及在 scala 中是否有更快的算法实现。谢谢。