2013-04-09 5 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 */ 

PerlまたはPythonスクリプトを実行しているときのように、Clojureの起動時間を少しでも短くできますか?起動時間が遅いのは、基礎となるフレームワークやClojureの問題(遅かれ早かれ修正可能)か、それとも設計上の問題なのでしょうか?Clojureの実装はどれも早く開始できますか?

注:start-persistent-server-than-connect-to-itの回避策についてはすでに知っています。

+0

私のシステム上のAOTのClojureのJARは、JVMの一つ – Ankur

答えて

3

起動時間は、Clojure自体が初期化の点で行う作業が主な原因です。これらのタスクのいくつかは非常に重要です。コアのClojure名前空間の読み込みとコンパイル。異なるプラットフォームの実装で実行しても、これは実際には変更されません。

しかし、将来的に最適化することが、このための大きな可能性があります:Clojureの自身の

  • 大部分は、先に-のタイムClojureのコンパイラ自体の
  • パフォーマンスをコンパイルすることができかもしれません
  • レイジーローディングやコンパイルによって知覚されるレイテンシが減少する可能性があります(ほとんどの場合、ほとんどのコードでclojure.coreや他の依存関係の名前空間のすべてが必要ではありません)。賢いかもしれないJVMがしばしばあるが、(不当に)非難することを並列ロードとコンパイル

注を行う方法、JVMはここに主に無関係です:現代のJVMを約0.1secsの起動時間を持っています。

私は実際にClojureで書かれたGUIアプリケーションのためにこれを利用します:mainメソッドを持つ純粋なJavaでスタートアップコードを書くことで、スプラッシュ画面とGUIの最初の画面をかなりすぐに表示してからClojureをロードします残りのアプリケーションコードをバックグラウンドで使用します。

+0

だけ1秒の制限がある取りますそのオブジェクトは初期化時にコピーする必要があります。「バイトコードで複合定数を埋め込むことはできません。 https://groups.google.com/forum/#!topic/clojure/PsgKVlWZjOw – noisesmith

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