为什么这个Clojure Reducers r/fold没有提供优势?

Sco*_*ach 6 performance clojure fold reducers

我想知道为什么下面的代码在r/fold的情况下没有提供加速?我是否误解了有关减速器的事情?

我在一个非常慢的(虽然有2个核心)Ubuntu 12.04开发盒上运行它,通过emacs和lein run,每个都有相同的结果.

(require '[clojure.core.reducers :as r])
(.. Runtime getRuntime availableProcessors)
Run Code Online (Sandbox Code Playgroud)

;; 2

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

  (time (reduce + (vs)))
  (time (r/fold + (vs)))
Run Code Online (Sandbox Code Playgroud)

"经过时间:26076.434324 msecs"
"经过时间:25500.234034 msecs"

谢谢.

Ale*_*ler 9

你正在折叠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)))
Run Code Online (Sandbox Code Playgroud)

观察最近两次跑步的最佳时间.