2014-10-10 1 views
5

아래 코드가 r/fold의 경우 속도가 향상되지 않는 이유가 궁금합니다. 나는 감속기에 관하여 오해하고 있습니까?왜이 Clojure Reducers r/fold는 퍼펙트 혜택을 제공하지 않습니까?

저는 꽤 느린 (비록 2 개의 코어가 있습니다) 우분투 12.04 dev box를 emacs와 lein run 모두를 통해 동일한 결과를 가지고 실행합니다.

(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

연속으로 접으십시오. 병렬 폴드는 현재 영구 벡터 및 맵에서만 발생합니다.

이러한 유형의 성능 테스트가 Criterium과 같은 것을 사용하는 것보다 열등한 이유는 여러 가지가 있지만 별개의 토론 일 수 있습니다. (가비지 콜렉션, JVM 웜업 및 인라인, Emacs 및 lein, boxed 및 checked 수학 등의 펑키 기본 jvm 설정).

위의 여러 가지 이유로 여전히 잘못되었지만 약간 더 유용한 비교 :

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

마지막 2 회 각각에서 가장 좋은 시간을보십시오.

관련 문제