Tôi có một câu hỏi về lý do tại sao có sự khác biệt về tốc độ giữa phương pháp vòng lặp và phương pháp lặp trong clojure. Tôi làm theo các hướng dẫn trong http://www.learningclojure.com/2010/02/clojure-dojo-2-what-about-numbers-that.html và định nghĩa hai phương pháp vuông gốc bằng cách sử dụng phương pháp Heron:Tại sao có sự khác biệt về tốc độ giữa vòng lặp của Clojure và phương pháp lặp lại
(defn avg [& nums] (/ (apply + nums) (count nums)))
(defn abs [x] (if (< x 0) (- x) x))
(defn close [a b] (-> a (- b) abs (< 1e-10)))
(defn sqrt [num]
(loop [guess 1]
(if (close num (* guess guess))
guess
(recur (avg guess (/ num guess)))
)))
(time (dotimes [n 10000] (sqrt 10))) ;;"Elapsed time: 1169.502 msecs"
;; Calculation using the iterate method
(defn sqrt2 [number]
(first (filter #(close number (* % %))
(iterate #(avg % (/ number %)) 1.0))))
(time (dotimes [n 10000] (sqrt2 10))) ;;"Elapsed time: 184.119 msecs"
Có khoảng một sự gia tăng về tốc độ x10 giữa hai phương pháp và tôi đang tự hỏi điều gì đang xảy ra bên dưới bề mặt để nguyên nhân hai người được như vậy pronouced?
tôi giả định 'sqrt2' đầu tiên là lỗi đánh máy? Ngoài ra, bạn cần phải lặp lại timings nhiều lần để có được kết quả hữu ích (jvm mất thời gian để tối ưu hóa). nó không thay đổi thực tế là một trong những chậm hơn, nhưng nó thay đổi đáng kể số lượng. –
Yep ... đã sửa nó ngay bây giờ ... vậy 10000 lần là chưa đủ? – zcaudate
tôi không biết chắc chắn, nhưng nó có vẻ là dựa trên thời gian - như, nó được nhanh hơn trong hai giây đầu tiên hoặc lâu hơn. bạn đã thử lặp lại nó và nhìn vào đầu ra từ thời gian()? –