【问题标题】:Clojure performance: REPL versus uberjarClojure 性能:REPL 与 uberjar
【发布时间】:2014-01-03 11:22:06
【问题描述】:

我想做一些实时图形渲染,并尝试对每帧的每个像素进行多次计算。然后我很快注意到这非常慢,并从最底层开始:我能以多快的速度循环所有像素?

我发现 dotimes 相当快,但是当我在 REPL 中执行此操作时非常慢:

user=> (dotimes [_ 10] (time (dotimes [_ 1e7] (+ 1 1))))
"Elapsed time: 409.177477 msecs"
"Elapsed time: 417.755502 msecs"
"Elapsed time: 418.939182 msecs"
"Elapsed time: 420.131575 msecs"
"Elapsed time: 419.83529 msecs"
"Elapsed time: 417.612003 msecs"
"Elapsed time: 420.749229 msecs"
"Elapsed time: 418.918554 msecs"
"Elapsed time: 414.403957 msecs"
"Elapsed time: 417.729624 msecs"
nil
user=>

然后我把它放到了一个 Leiningen 项目中。当我进行“lein run”时,它同样慢。但是当我创建 uberjar 并使用 java 命令运行它时,它会快很多:

% java -jar target/looping-0.1.0-SNAPSHOT-standalone.jar 
"Elapsed time: 122.006758 msecs"
"Elapsed time: 3.667653 msecs"
"Elapsed time: 3.60515 msecs"
"Elapsed time: 4.008436 msecs"
"Elapsed time: 3.961558 msecs"
"Elapsed time: 3.60212 msecs"
"Elapsed time: 3.592532 msecs"
"Elapsed time: 4.573949 msecs"
"Elapsed time: 3.959568 msecs"
"Elapsed time: 3.607495 msecs"

虽然第一次运行还是慢了很多。有什么不同?在这两种情况下,代码都是编译的,没有解释的 Clojure,对吧?是为 REPL 设置的 JIT、一些优化还是一些特殊的 JVM 选项?

感谢您的任何想法。

【问题讨论】:

  • 我无法重现 REPL 缓慢。你的设置是什么?

标签: performance clojure


【解决方案1】:

Leiningen 使用某些默认选项运行 JVM,这些选项可以缩短启动时间,但会降低运行时性能。因此,您可能想再次检查将:jvm-opts ^:replace [] 添加到您的project.clj


除此之外,虽然下面没有添加任何内容来解释 REPL 和 überjar 之间的时间差异,但我想我会评论基准测试,以防您关心准确的结果:

time 不是一个很好的基准测试工具,无论是否使用dotimes。 (没有dotimes——JIT 编译器不会启动;dotimes——它可能会启动,但很可能会决定循环体是一个 noop 并完全优化它。)

Hugo Duncan 的 Criterium 是强大的 Clojure 解决方案,它负责 JIT 预热、以不会被优化掉的方式循环以及对结果进行统计处理。一个简单的 Criterium 基准测试可能如下所示:

(require '[criterium.core :as c])

(def v [0 1 2])

(c/bench (nth v 0))

(这测量了访问 Var 中保存的短向量的初始元素的时间。我希望 (+ 1 1) 最终会编译为常量,因此可能没有什么可以进行基准测试了。)

【讨论】:

  • 我认为这确实是 JVM 选项,在项目中设置 :jvm-opts 我现在可以得到与 REPL 相同的性能。谢谢。
  • 似乎这是由于 JVM 的 TieredCompilation 选项。如果我在手动运行 JAR 时设置与 Leiningen 相同的选项,它也会变得非常慢。
猜你喜欢
  • 1970-01-01
  • 2018-10-05
  • 2019-01-21
  • 2015-11-29
  • 1970-01-01
  • 2015-11-20
  • 2021-01-22
  • 2011-06-28
  • 2016-10-18
相关资源
最近更新 更多