6

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

我通过 emacs 和 lein run 在一个相当慢的(尽管有 2 个内核)Ubuntu 12.04 开发箱上运行它,每个都具有相同的结果。

(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 毫秒”

谢谢。

4

1 回答 1

9

你正在折叠一个序列。平行折叠现在只发生在持久向量和地图上。

这种性能测试不如使用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)))

观看最近 2 次运行中每一次的最佳时间。

于 2014-10-10T02:43:16.493 回答