我的朋友给了我这个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算法实现。谢谢。
SP = BP; BP = POP SP
。 - Daniel C. Sobral