2012-12-11 2 views
16

もし私が推測しなければならないのは、答えがClojureだと確信していますが、私はなぜそれがわかりません。論理的には(私には)速くなければなりませんClojureScriptのように思える:ClojureやClojureScriptの方が速いのはなぜですか?

の両方が「ダイナミック」ですが、ClojureScriptは

  • V8エンジンは間違いなく最速の動的言語エンジンであるV8上で実行して、JavaScriptにコンパイル
  • V8
  • はCで書かれてある

Clojureの一方:

  • も組み込みの動的なサポートを持っていないJVM、ダイナミック
  • 実行されますので、私はこのようにJVMが
  • ダイナミックサポートを有効にするために、あまりにもやっているものは何でもV8関係しているとJavaはより遅いと思っていますC

ClojureScriptよりもClojureの方が速いのはなぜですか? JavaScriptが動的でClojureが動的であると言うとき、「動的」とは何か違うのですか?私は何を見ていないのですか?

は(ClojureScript は確かに速いある場合はもちろん、その後、上記の推論が正しい?)

私は推測する、Clojureのはに何をコンパイルん....質問の少なくとも一部です。私は、JVMの部分が単なるインタプリタではないことを知っています(そうでなければClojureScriptは速くなります)。しかし、Clojureは通常のバイトコードにコンパイルできません。では、ClojureScriptのコンパイル/実行方法と、Clojureのコンパイル/エクセキュート方法と、Javaのコンパイル/実行方法の違いと、パフォーマンスの違いがそれぞれどのような意味を持つのでしょうか?

+5

「JavaはCよりも遅い」は、多くの問題のドメインで真実かもしれませんが、無関係です。適切な質問は「JavaがV8よりも遅いか」です。 V8はあなたのコードをコンパイルされたCコードとして実行しません。これはCで書かれたJavaScriptインタプリタです。 –

+0

@EricJ。私はそれが私の質問だと思う、私はClojureを生成したJavaScriptとClojureを解釈するJVMを解釈するV8を見ている。 V8はJSをマシンコードにコンパイルして実行します。 JVMはこれより何が速いのですか? – lobsterism

+1

ClojureはJavaと同様にバイトコードにコンパイルされています。あなたはそれがそうではないと思ったのですか? –

答えて

24

この質問は特定のベンチマークタスク(または特定のバージョンのClojureまたはClojureScript)を参照することなく、正確に答えることは難しいです。

ほとんどの状況で、私はClojureがやや速くなると思います。理由:

  • Clojureの通常静的コードにコンパイルダウン、それは実際には、実行時に任意の動的な検索を行いません。これは非常に重要です。高性能コードは、しばしば静的型付けJavaと非常によく似たバイトコードを生成します。問題は、動的言語が実行時に動的なメソッド検索を行わなければならないという誤った仮定をしているように見えます:これは必ずしもそうではありません(通常はClojureにはありません)
  • JVM JITは非常にうまく設計されていますV8がいかに優れているにもかかわらず、現在のところJavaScript JITよりもまだ少し上手だと思います。
  • 複数のコアを利用する必要がある場合は、JavaScriptが単一スレッドなのでコンテストはありません.....
  • ClojureコンパイラはClojureScriptより成熟しており、 (プリミティブサポート、プロトコルなどを含む)

もちろん、どの言語でも高速または低速のコードを書くことができます。これにより、言語実装の基本的な違いよりも大きな違いが生じます。

さらに基本的に、ClojureとClojureScriptの間の選択は、どのような場合でもパフォーマンスに関するものではありません。両方とも魅力的な生産性の利点を提供します。あなたがウェブ上で実行したい場合は、

  • あなたはJVMのenvironnmentにサーバー上で実行したい場合はClojureScript
  • を使用し、これはClojureの
+0

さて、あなたの最初のポイントは私の混乱の源だったと思います。つまり、誰かが動的なものを「乱用している」とランタイムが常に動的なルックアップを行っていたら、誰が速いのかを知っているが、時間とバイトコードの99%がそこで解釈されるコードを打ち負かすのではなく、右?パフォーマンスの違いが何であるか考えていますか?私はプレーンな実行がボトルネックであると思うのですが、それはJS対Javaと同じ%差ですか? – lobsterism

+2

Java対JavaScriptは、よく最適化されたClojureと適切に最適化されたClojureScriptの間におおよその差異を与えるでしょう。結局のところ、長期的にはClojureはJavaのパフォーマンスに、ClojureScriptはJavaScriptのパフォーマンスに向かう傾向があります。 – mikera

28

実際、V8はC++で書かれています。しかし、基本的にはJVMと同じことですが、JVMはC. V8 JITのJavascriptコードで記述され、JITコードを実行します。同様に、JVM JITは、バイトコード(Javaではなく)をコンパイル(またはホットスポット・コンパイル)し、生成されたコードを実行します。

Javaはバイトコードは静的ではありません。実際、それはかなりダイナミックになる可能性があります。一方、Javaはほとんど静的であり、Javaとバイトコードを組み合わせることは正しくありません。 JavaコンパイラはJavaソースコードをバイトコードに変換し、JVMはバイトコードを実行します。詳細については、John Roseのブログ(example)をご覧ください。そこには多くの良い情報があります。また、Cliff Click(のような)による会談を探してみてください。

同様に、Clojureコードはバイトコードに直接コンパイルされ、JVMはそのバイトコードで同じ処理を行います。 Clojureのコンパイルは通常実行時に行われますが、これは最速のプロセスではありません。同様に、ClojurescriptからJavascriptへの変換も高速ではありません。 Javascriptから実行形式へのV8の翻訳は明らかにかなり速いです。しかし、Clojureはバイトコードにコンパイルされているので、起動時のオーバーヘッドを大幅に削減できます。

あなたが言ったように、JVMがバイトコードを解釈するとは言っても間違いありません。 1.0リリースは、17年以上前のことでした。

従来、2つのコンパイルモードがありました。最初のモードはJIT(Just in Time)コンパイラです。バイトコードがマシンコードに直接変換される場所。JavaのJITコンパイルは高速に実行され、高度に最適化されたコードは生成されません。それはOKを実行します。

第2のモードは、ホットスポットコンパイラと呼ばれます。ホットスポットコンパイラは非常に洗練されています。これは、インタープリターモードで非常に迅速にプログラムを開始し、プログラムが実行されると解析します。ホットスポット(頻繁に実行されるコード内のスポット)を検出すると、ホットスポットがコンパイルされます。 JITコンパイラは、JITされていない限り何も実行しないため、高速でなければならないのに対し、ホットスポットコンパイラはコンパイルするコードからsnotを最適化する余分な時間を費やす余裕があります。

さらに、必要に応じて後でそのコードに戻って、さらに最適化を適用できます。これは、ホットスポットコンパイラがコンパイルされたC/C++を打ち始めることができるポイントです。コードのランタイム知識を持っているので、静的なC/C++コンパイラではできない最適化を適用する余裕があります。たとえば、仮想関数をインライン化できます。

ホットスポットにはもう1つの機能があります。私の知る限り、他の環境はありません。また、必要に応じてコードを最適化することもできます。たとえば、コードが継続的に単一の分岐を取っていて、最適化されており、ランタイム条件がコードを他の(最適化されていない)分岐に強制的に変更し、突然パフォーマンスがひどくなる場合です。ホットスポットは、その機能を最適化しないようにし、分析を再開して、それをよりうまく動作させる方法を見つけ出すことができます。

ホットスポットの欠点は、少し遅く始まることです。 Java 7 JVMの1つの変更点は、JITコンパイラとホットスポットコンパイラを組み合わせたことです。しかし、このモードは新しく、デフォルトではありませんが、最初の起動時には良い状態にしてから、advanced optimizationsを起動してJVMがうまく動作するようにしてください。

乾杯!

+0

ありがとう、私は実際にJVMがダイナミクスをサポートしているかどうか分かりませんでした。私はhttp://blog.fogus.me/2011/10/14/why-clojure-doesnt-need-invokedynamic-bit-it-might-be-niceを見つけましたが、これはClojureが実際には偶数ではないことを示していますその機能を利用するだけでなく、なぜそれがまだ高速であるのかを理解するのに役立ちます。 – lobsterism

+0

昨年Rich HickeyのClojure Conj基調講演を視聴した場合、彼はその機能のサポートについて語っています。それは良いでしょうが、古いJVMには問題があります。 – Bill

+1

また、実際の回答を質問に追加するのを忘れました。場合によります。 ;-) – Bill

1

を使用します。主な決定要因はする必要がありますHotSpot VMとV8 jsエンジンの両方が、Sun MicrosystemsのSelfプロジェクトに由来している可能性があります。これは、彼らができるだけ早く実行できる多くの技術を試作したと思います行う。両方を比較するときに考慮すべき点私はこれをコメントとして投稿していただろうが、評判システムは私を妨害した。

関連する問題