2014-10-10 18 views
5

我想知道爲什麼下面的代碼在r/fold的情況下沒有提供加速功能?我誤解了減速機的一些事情嗎?爲什麼這個Clojure Reducers r/fold沒有提供性能優勢?

我在一個相當慢的(儘管有2個內核)Ubuntu 12.04 dev盒子上運行它,兩者都通過emacs和lein運行,每個都有相同的結果。

(require '[clojure.core.reducers :as r]) 
(.. Runtime getRuntime availableProcessors) 

;;; 2

(let 
    [n 80000000 
    vs #(range n)] 

    (time (reduce + (vs))) 
    (time (r/fold + (vs))) 

「經過時間:26076.434324毫秒」
「經過時間:25500.234034毫秒」

感謝。

回答

7

您正在摺疊一個seq。平行摺疊僅發生在持久矢量和地圖上。

也有各種各樣的原因,爲什麼這種性能測試不如Criterium,但這可能是一個單獨的討論。 (其中一些原因是垃圾收集,JVM熱身和內聯,Emacs和Lein上的時髦默認jvm設置,盒裝和檢查數學等)。

上述許多原因仍存在錯誤,但稍有用處的比較:

(require '[clojure.core.reducers :as r]) 
(def v (vec (range 800000))) 
(dotimes [_ 100] (time (reduce + v))) 
(dotimes [_ 100] (time (r/fold + v))) 

從最近的兩次運行中觀看最佳時間。

相關問題