Clojure瞬态示例-无明显加速

Clojure瞬态示例-无明显加速,clojure,Clojure,我从以下位置复制了代码: 但我的结果与发布的结果有显著差异 (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

我从以下位置复制了代码:

但我的结果与发布的结果有显著差异

(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"
是不是自从这里发布关于瞬变的帖子以来,持久性实现有所改进

还有哪些其他因素可能导致瞬态升压不足


我在ubuntu 12.04上使用OpenJDK java 1.7版。也许这比文档中使用的热点1.6版本慢很多?但是,这难道不意味着这两个测试都应该以相同的间隔慢一些吗?

你的结果与我的瞬变经验是一致的。我经常使用它们,通常会看到性能提高2倍

我在Ubuntu12.04、OpenJDK1.7以及Clojure1.6.0和1.7.0-alpha3上试过这个。我在使用瞬态时获得了2倍的性能,略低于在使用1.8 Oracle jvm的OSX上获得的3倍


上面的页面也是从Clojure 1.2时代开始的,从那时起,集合的性能有了显著的提高。我试着用1.2做实验,但是Criterium不能用它,所以我不得不像那页一样使用时间。显然,结果有很大差异(从2x到8x)。我怀疑文档中的示例可能是精心挑选的。

谢谢迭戈。这就是我希望的原因。换句话说,并不是瞬态比文档中报告的慢,而是持久性收集更快。
(quick-bench (def v (vrange 1000000)))
"Elapsed time: 121.14 msecs"

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