Một người bạn đã cho tôi đoạn mã này trong ClojureTại sao Clojure nhanh hơn Scala một hàm đệ quy?
(defn sum [coll acc] (if (empty? coll) acc (recur (rest coll) (+ (first coll) acc))))
(time (sum (range 1 9999999) 0))
và hỏi tôi làm thế nào nó giá vé đối với việc thực hiện Scala tương tự.
vẻ Mã Scala Tôi đã viết như thế này:
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")
Điểm mấu chốt là: mã trong Clojure chạy trong khoảng 1,8 giây trên máy tính của tôi và sử dụng ít hơn 5MB của heap, mã trong Scala chạy trong khoảng 12 giây và 512MB đống không đủ (nó kết thúc tính toán nếu tôi đặt heap thành 1GB).
Vì vậy, tôi tự hỏi tại sao Clojure nhanh hơn và mỏng hơn nhiều trong trường hợp cụ thể này? Bạn có thực hiện Scala có hành vi tương tự về tốc độ và mức sử dụng bộ nhớ không?
Xin vui lòng không nhận xét tôn giáo, quan tâm của tôi nằm trong việc tìm ra chủ yếu những gì làm cho clojure quá nhanh trong trường hợp này và nếu có một thực hiện nhanh hơn của algo trong scala. Cảm ơn.
Được cấp, tài khoản này giúp tăng mức sử dụng bộ nhớ. Điều gì về thời gian tính toán tăng lên? –
Thời gian tính toán tăng được dành cho việc phân bổ bộ nhớ, và vô tình cố gắng thu gom rác. –
Nếu bạn sử dụng một nhóm các vật thể tái chế, nó có tăng tốc lên rất nhiều không? Các JVM xử lý các đối tượng heap ngắn ngủi với hiệu quả giống như một chồng, vì vậy nó sẽ làm tôi ngạc nhiên nếu GC đã thực sự mất rất nhiều thời gian. –