【发布时间】: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