【发布时间】:2014-11-20 07:06:05
【问题描述】:
我从以下位置复制代码:
但我的结果与发布的结果大不相同。
(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