我想知道为什么下面的代码在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”
感谢。
答案 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)))
观察最近两次跑步的最佳时间。