【问题标题】:Clojure Transients Example - No significant speedupClojure 瞬态示例 - 没有显着的加速
【发布时间】:2014-11-20 07:06:05
【问题描述】:

我从以下位置复制代码:

http://clojure.org/transients

但我的结果与发布的结果大不相同。

(defn vrange [n]
  (loop [i 0 v []]
    (if (< i n)
      (recur (inc i) (conj v i))
      v)))

(defn vrange2 [n]
  (loop [i 0 v (transient [])]
    (if (< i n)
      (recur (inc i) (conj! v i))
      (persistent! v))))



(quick-bench (def v (vrange 1000000)))
"Elapsed time: 459.59 msecs"

(quick-bench (def v2 (vrange2 1000000)))
"Elapsed time: 379.85 msecs"

这是一个轻微的加速,但没有像示例文档中暗示的 8 倍提升?

在服务器模式下启动 java 改变了故事,但仍然没有像文档那样..

(quick-bench (def v (vrange 1000000)))
"Elapsed time: 121.14 msecs"

(quick-bench (def v2 (vrange2 1000000)))
"Elapsed time: 75.15 msecs"

自从这里关于瞬态的帖子:http://clojure.org/transients 以来,持久性实现是否有所改进?

还有哪些其他因素可能导致瞬态缺乏提升?

我在 ubuntu 12.04 上使用 OpenJDK java 版本 1.7。也许这比文档中使用的(假定的)Hotspot 1.6 版本慢很多?但这是否意味着两个测试都应该以相同的差距变慢一些常数?

【问题讨论】:

    标签: clojure


    【解决方案1】:

    您的结果与我对瞬态的经验一致。我已经使用了很多次,我通常会看到 2 倍的性能提升。

    我在 Ubuntu 12.04、OpenJDK 1.7 和 Clojure 1.6.0 和 1.7.0-alpha3 上试过这个。我在瞬态方面获得了 2 倍的性能,略低于我在 OSX 上使用 1.8 Oracle jvm 获得的 3 倍。

    另外上面的页面是从 Clojure 1.2 的时候开始的,从那时起集合的性能有了显着的提升。我尝试了 1.2 的实验,但 Criterium 不适用于它,所以我不得不像在那个页面上一样使用时间。显然,结果变化很大(从 2 倍到 8 倍)。我怀疑文档中的示例可能是精心挑选的。

    【讨论】:

    • 谢谢迭戈。这就是我希望的原因。换句话说,并不是瞬态比文档中报告的慢,而是持久集合更快。
    猜你喜欢
    • 2012-09-05
    • 2013-05-15
    • 2011-03-13
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    相关资源
    最近更新 更多