我复制了以下代码:
但我的结果与发布的结果明显不同.
(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"
Run Code Online (Sandbox Code Playgroud)
这是一个轻微的加速,但没有像示例文档中隐含的8倍提升?
在服务器模式下启动java会改变故事,但仍然没有像文档那样.
(quick-bench (def v (vrange 1000000)))
"Elapsed time: 121.14 msecs"
(quick-bench (def v2 (vrange2 1000000)))
"Elapsed time: 75.15 msecs"
Run Code Online (Sandbox Code Playgroud)
自从关于瞬态的帖子以来,持久性实现是否有所改进:http://clojure.org/transients?
还有哪些因素可能导致瞬态缺乏?
我在ubuntu 12.04上使用OpenJDK java版本1.7.也许这比文档中使用的(推测的)Hotspot 1.6版本要慢很多?但这不意味着BOTH测试应该缓慢一些常数,同样的差距吗?
您的结果与我对瞬态的经验一致。我经常使用它们,通常会看到性能提高 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 不适用于它,因此我必须像该页面上那样使用时间。显然,结果差异很大(从 2 倍到 8 倍)。我怀疑文档中的示例可能是精心挑选的。
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |