簡體   English   中英

用Clojure期貨計算多頭總和

[英]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年中

  • 2.3 GHz英特爾酷睿i7
  • 16 GB RAM
  • Java(TM)SE運行時環境(內部版本1.7.0_45-b18)

結果:

serial:   2678.034 msecs
parallel: 1943.153 msecs
Parallel takes 72.3% of baseline.

請注意,這些結果與我最初的評論有所不同。 該數據是從REPL運行的。

聯想Thinkstation S20

  • 3.07GHz英特爾至強W3550
  • 8 GB RAM
  • Java(TM)SE運行時環境(內部版本1.7.0_45-b18)

結果:

Serial:   12390.296313 msecs
Parallel:  6856.656525 msecs
Parallel takes 55.3% of baseline.

我可以想到基准測試時可能遇到的兩個問題:

  1. 機器沒有多個內核/ Java僅限於一個內核/否則將加載內核。
  2. 對JVM進行基准測試比較棘手。 通常,建議使用標准代替。 但是,我上面的數字只是使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM