Tôi đang tổng hợp một danh sách dài các tỷ lệ trong Clojure, một cái gì đó như:Chỉ số Tổng kết Clojure là chậm
(defn sum-ratios
[n]
(reduce
(fn [total ind]
(+
total
(/
(inc (rand-int 100))
(inc (rand-int 100)))))
(range 0 n)))
Thời gian chạy cho nhiều n là:
- n = 10^4 .. .... 41 ms
- n = 10^6 ...... 3.4 s
- n = 10^7 ...... 36 s
The (ít chính xác) thay thế là tổng hợp các giá trị như tăng gấp đôi:
(defn sum-doubles
[n]
(reduce
(fn [total ind]
(+
total
(double
(/
(inc (rand-int 100))
(inc (rand-int 100))))))
(range 0 n)))
Thời gian chạy cho phiên bản này là:
- n = 10^4 ...... 8.8 ms
- n = 10^6 ...... 350 ms
- n = 10^7 ...... 3.4 s
Tại sao tỷ lệ tổng hợp lại chậm hơn đáng kể? Tôi đoán rằng nó đã làm với việc tìm kiếm nhiều phổ biến nhất của các mẫu số của tỷ lệ được tổng kết, nhưng không ai biết cụ thể mà thuật toán Clojure sử dụng để tổng tỷ lệ?
Ngoài ra, nếu bạn muốn sử dụng đôi, hãy làm điều đó trước khi chia. Rẻ hơn nhiều để làm một bộ phận với một int và một đôi retunbing một doubke hơn một bộ phận mà phải tính toán một tỷ lệ, sau đó phôi rằng một đôi. – NielsK