2013-04-09 21 views
5
$ time java -jar clojure-1.4.0.jar -e '(println "Hello world")' 
Hello world 

real 0m4.586s 

$ time python clojure.py -c '(py/print "Hello world")' 

real 0m14.690s 

$ time mono Clojure.Main.exe -e '(println "hello world")' 
hello world 

real 0m4.843s 

/* clojure-metal is not tested due to not being written at the moment */ 

Clojure的启动时间很少,就像我运行Perl或Python脚本一样?启动时间很慢是底层框架还是Clojure的问题(可以早晚修复)还是设计?任何Clojure实现能够快速启动吗?

注意:我已经知道启动持久服务器而不是连接到它的解决方法。

+0

我的系统上的AOT Clojure的JAR采取只需要1秒 – Ankur 2013-04-10 04:14:46

回答

3

启动时间主要是因为Clojure本身在初始化方面所做的工作。其中一些任务非常重要,例如加载和编译核心Clojure命名空间。在不同的平台实现上运行并不会真的改变这一点。

然而,有一个很大的潜力,这在将来进行优化:

  • 的Clojure本身的大部分地区可能是Clojure的编译器本身可能是名列前茅的时间编译
  • 性能增强
  • 延迟加载和/或编译可以减少感知等待时间(可能是最大的胜利:大多数代码并不需要所有clojure.core和其他依赖的命名空间,或至少不立即)
  • 有人很聪明的可能会弄清楚如何进行并行加载和编译

请注意,尽管JVM经常(不公正地)被指责,但JVM在很大程度上与此无关:现代JVM的启动时间约为0.1secs。

我实际上将它用于以Clojure编写的GUI应用程序:通过使用main方法将启动代码写入纯Java中,可以立即显示启动画面并且GUI的第一个屏幕几乎立即显示,然后沿着Clojure加载其余的应用程序代码在后台。

+0

一个限制的JVM是必须在初始化时复制对象,“您不能在字节代码中嵌入任何复合常量,甚至不能包含数组。” https://groups.google.com/forum/#!topic/clojure/PsgKVlWZjOw – noisesmith 2013-08-26 20:24:56

4

ClojureScript可以很快启动。这个数字有点误导,因为它在编译时删除了死代码。这意味着这个片段被编译成只有print("hello world");。下面是我得到我的机器上:

$ echo '(js/print "hello world")' > hello.cljs 
$ cljsc hello.cljs '{:optimizations :advanced}' > hello.js 
$ time rhino hello.js 
hello world 

real 0m0.466s 

为了便于比较,这里是我开始使用正常的Clojure:

$ time java -jar clojure-1.4.0.jar -e '(println "hello world")' 
hello world 

real 0m1.369s