我从以下网址复制了代码:
但我的结果与发布的结果有显著差异。
(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版本慢很多?但这难道不意味着两个测试的速度都会变慢,并且差距相同吗?