Clojure Transients示例 - 没有显着的加速

时间:2014-11-20 07:06:06

标签: clojure

我复制了以下代码:

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版本要慢得多?但这并不意味着BOTH测试应该缓慢一些常数,同样的差距?

1 个答案:

答案 0 :(得分:1)

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

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

此外,上面的页面是从Clojure 1.2开始的,从那时起收集的性能得到了显着提升。我尝试了1.2的实验,但是Criterium没有使用它,所以我不得不像在那个页面上一样使用时间。显然结果是显着变化的(从2x到8x)。我怀疑文档中的示例可能已被挑选出来。