Performance 任何Clojure实现都能快速启动吗?

Performance 任何Clojure实现都能快速启动吗?,performance,clojure,Performance,Clojure,Clojure的启动时间可以很短吗,就像我运行Perl或Python脚本时一样?启动时间慢是底层框架或Clojure的问题(迟早可以解决)还是设计的问题 注意:我已经知道启动持久服务器而不是连接到它的解决方法。启动时间主要是因为Clojure本身在初始化方面所做的工作。其中一些任务非常重要,例如加载和编译核心Clojure命名空间。在不同的平台实现上运行不会真正改变这一点 然而,这在未来有很大的潜力可以优化: Clojure本身的大部分可以提前编译 Clojure编译器本身的性能可以得到增强

Clojure的启动时间可以很短吗,就像我运行Perl或Python脚本时一样?启动时间慢是底层框架或Clojure的问题(迟早可以解决)还是设计的问题


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

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

然而,这在未来有很大的潜力可以优化:

  • Clojure本身的大部分可以提前编译
  • Clojure编译器本身的性能可以得到增强
  • 延迟加载和/或编译可以减少感知的延迟(可能是最大的好处:大多数代码不需要clojure.core和其他依赖项中的所有名称空间,或者至少不需要立即使用)
  • 一些非常聪明的人可能会想出如何进行并行加载和编译
请注意,尽管JVM经常(不公正地)受到指责,但JVM在这里基本上是不相关的:现代JVM的启动时间约为0.1秒


事实上,我在Clojure编写的GUI应用程序中利用了这一点:通过使用
main
方法在纯Java中编写启动代码,您可以拥有一个启动屏幕,GUI的第一个屏幕几乎立即出现,然后在后台加载Clojure和其他应用程序代码。

ClojureScript可以很快启动。不过,这个数字有点误导人,因为它在编译时会删除死代码。这意味着这段代码将被编译成
print(“helloworld”)。以下是我在机器上得到的信息:

$ 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得到的结果:

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

real    0m0.466s

我的系统上的AOT clojure JAR只需1秒,JVM的一个限制是必须在初始化时复制对象,“不能在字节码中嵌入任何复合常量,甚至数组也不能。”
$ time java -jar clojure-1.4.0.jar -e '(println "hello world")'
hello world

real    0m1.369s