[英]Computing a long sum with Clojure futures
運行此代碼:
(ns playfield.core)
(defn sum
[start end]
(reduce + (range start end)))
(def size 1e8)
(defn -main
[& args]
(println (time (sum 0 size)))
(println (time (let [left (future (sum 0 (/ size 2)))
right (future (sum (/ size 2) size))]
(+ @left @right)))))
給我這個輸出:
"Elapsed time: 2742.185 msecs"
4999999950000000
"Elapsed time: 2605.541 msecs"
4.99999995E15
我原本希望第二個計算花費大約一半的時間,因為我將計算分布在兩個線程上。 我究竟做錯了什么?
我(加修飾你的榜樣位(shutdown-agents)
在結束-main
)跑( lein run -m playfield.core
)這兩台機器上:
視網膜Macbook Pro,2012年中
結果:
serial: 2678.034 msecs
parallel: 1943.153 msecs
Parallel takes 72.3% of baseline.
請注意,這些結果與我最初的評論有所不同。 該數據是從REPL運行的。
聯想Thinkstation S20
結果:
Serial: 12390.296313 msecs
Parallel: 6856.656525 msecs
Parallel takes 55.3% of baseline.
我可以想到基准測試時可能遇到的兩個問題:
time
生成的,因此我不確定這里是否起作用。 編輯
我有一些更多的想法:
如@lgrapenthin所述,JVM選項會影響時間。 例如,lein使用以下兩個選項來縮短啟動時間 : -XX:+TieredCompilation -XX:TieredStopAtLevel=1
。 對於這種情況,更改此設置具有明顯的區別:
$ LEIN_JVM_OPTS="" lein run -m 'speed.core'
Serial: 2496.435288 msecs
Parallel: 2045.084565 msecs
Parallel takes 81.9% of baseline.
@Giuseppe的評論指出,正在積極使用4個內核(我認為這意味着充分利用)。 也許JVM具有很高的內存壓力,並且CPU使用率正在使垃圾回收器瘋狂地工作以使一些內存可用。 但是,我無法在本地復制此內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.