Clojure transient 示例 - 没有显着的加速

标签 clojure

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

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"

自发布关于 transient 的帖子以来,持久实现是否有所改进:http://clojure.org/transients

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

我在 ubuntu 12.04 上使用 OpenJDK java 版本 1.7。也许这比文档中使用的(假定的)Hotspot 1.6 版本慢很多?但这是否意味着两个测试都应该慢一些常数,并且差距相同?

最佳答案

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

我在 Ubuntu 12.04、OpenJDK 1.7 和 Clojure 1.6.0 和 1.7.0-alpha3 上尝试过这个。我通过 transient 获得了 2 倍的性能,略低于使用 1.8 Oracle jvm 在 OSX 上获得的 3 倍。

另外,上面的页面是从 Clojure 1.2 开始的,从那时起,集合的性能有了显着的提高。我尝试使用 1.2 进行实验,但 Criterium 不适用于它,因此我必须像该页面上那样使用时间。显然,结果差异很大(从 2 倍到 8 倍)。我怀疑文档中的示例可能是精心挑选的。

关于Clojure transient 示例 - 没有显着的加速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27033704/

相关文章:

concurrency - 在下面的 Clojure 代码中,alter 可以替换为 Commute 吗?

Clojure静态内部类实例化问题(互操作问题)

ajax - Clojurescript 序列化表单 AJAX POST

clojure - 为什么这个关键字函数查找在 HashMap 中不起作用?

Clojure:如何从 jar 运行我的 main?

import - 加载 clojure-contrib

sql - Compojure + clojure.contrib.sql : SELECT query is being cached. 为什么?

java - Java 与 Clojure 的良好并发示例

scala - 来自 Scala 类的 Clojure ISeq

clojure - 将数据传递给黑色 View - Clojure