친구가 Clojure가 재귀 적 추가 기능에서 Scala보다 훨씬 빠른 이유는 무엇입니까?
(defn sum [coll acc] (if (empty? coll) acc (recur (rest coll) (+ (first coll) acc))))
(time (sum (range 1 9999999) 0))
Clojure의
나에게이 코드를주고 그것을 유사한 스칼라 구현에 대한 요금을 어떻게하는지 나에게 물었다. 이 같은스칼라 코드 내가 작성한 외모 :
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 초에서 실행 스칼라 코드를 힙의 5메가바이트 이하 사용 약 12 초 만에 실행되며 512MB의 힙만 있으면 충분하지 않습니다 (힙을 1GB로 설정하면 계산이 완료됩니다).
그래서이 특별한 경우에 왜 Clojure가 훨씬 빠르고 슬림하게되어 있는지 궁금합니다. 속도와 메모리 사용면에서 비슷한 동작을하는 스칼라 구현이 있습니까?
종교적 비평을 삼가 해주십시오. 제 관심 사항은 무엇보다도이 경우 clojure를 매우 빨리 만드는 것이고, 스칼라에서 알 고의 구현이 더 빠르다는 것입니다. 감사.
부여 된 메모리 사용량이 증가합니다. 증가 된 계산 시간은 어떻습니까? –
계산 시간이 늘어남에 따라 메모리를 할당하는 데 소요되는 시간이 낭비되고 낭비없이 가비지 수집하려고합니다. –
재활용 된 물체를 사용했다면 속도가 빨라 집니까? JVM은 수명이 짧은 힙 오브젝트를 스택과 같은 효율성으로 처리하므로 GC가 실제로 많은 시간을 소비한다면 놀라게 될 것입니다. –