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

时间:2014-10-10 01:47:50

标签: performance clojure fold reducers

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

我在一个非常慢的(虽然有2个核心)Ubuntu 12.04开发盒中运行它,通过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 msecs”
“经过时间:25500.234034 msecs”

感谢。

1 个答案:

答案 0 :(得分: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)))

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