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

5

我从以下网址复制了代码:

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"

自从这篇关于transients的文章发布以来,持久实现是否已经改善了:http://clojure.org/transients

还有哪些因素可能导致transients缺乏提升?

我正在使用Ubuntu 12.04上的OpenJDK Java版本1.7。也许它比文档中使用的(假定的)Hotspot 1.6版本慢很多?但这难道不意味着两个测试的速度都会变慢,并且差距相同吗?

1个回答

1

你的结果与我使用transients的经验相符。我经常使用它们,通常会看到2倍的性能提升。

我在Ubuntu 12.04、OpenJDK 1.7和Clojure 1.6.0和1.7.0-alpha3上尝试过这个方法。我使用transients时得到了2倍的性能提升,略低于在OSX上使用1.8 Oracle jvm时得到的3倍性能提升。

此外,上面的页面来自Clojure 1.2时期,自那时以来集合的性能有了显着改善。我尝试了1.2版本的实验,但Criterium无法与之配合,所以我必须像那个页面一样使用时间。显然,结果有很大的变化(从2倍到8倍)。我怀疑文档中的示例可能是精心挑选的。


谢谢迭戈。这正是我希望的原因。换句话说,瞬态对象并不比文档中所述的慢,而是持久化集合更快。 - Scott Klarenbach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接