2013-04-09 32 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