首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure性能: REPL与uberjar

Clojure性能: REPL与uberjar
EN

Stack Overflow用户
提问于 2014-01-03 11:22:06
回答 1查看 1.2K关注 0票数 9

我想做一些实时图形渲染,并试图做多个计算每像素每帧。然后我很快注意到这是非常慢的,从最基本的开始:我能多快的循环所有的像素?

我发现做事情的速度相当快,但当我在REPL中这样做时,速度非常慢:

代码语言:javascript
复制
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=>

然后我把这个放到莱宁根的一个项目里。当我做一次“慢跑”的时候,它也是一样的缓慢。但是,当我创建uberjar并使用java命令运行它时,速度要快得多:

代码语言:javascript
复制
% 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选项呢?

谢谢你的建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-03 17:00:57

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

除此之外,尽管下面的内容并不能解释REPL和überjar之间的时间差异,但我想我会评论一下基准,以防您关心准确的结果:

time不是一个很好的基准测试工具,不管是否使用dotimes。(没有dotimes -- JIT编译器不会启动;使用dotimes --它可能会,但很可能决定循环的主体是一个节点,并对其进行完全优化。)

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

代码语言:javascript
复制
(require '[criterium.core :as c])

(def v [0 1 2])

(c/bench (nth v 0))

(这是指访问Var中包含的短向量的初始元素的时间。我预计(+ 1 1)最终会被编译成一个常量,因此可能没有什么可供基准测试的了。)

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20902479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档