Clojure on JVM と CLR のパフォーマンス比較はありますか? それとも、パフォーマンスが重要なコードで両方を使用したことのある人から、逸話的なコメントをいただけるでしょうか?
2 に答える
Clojure JVM のパフォーマンスは、Clojure CLR よりも優れています。明示的なベンチマークはありませんが、両方の環境でコンパイルとテストを実行した経験が豊富で、違いは明らかです。
違いにはいくつかの要因が関係しています。いくつかは取り組んでいます。一部は JVM と CLR のパフォーマンスの違いに関連しているため、ClojureCLR 開発者が対処する手段を超えています。
(1) プラットフォーム中間言語への Clojure コードのコンパイル。
最も基本的なレベルでは、生成される IL はほぼ同じです。ただし、動的言語ランタイムのいくつかの制限によって強制される設計の選択により、各関数定義が余分なクラスを作成し、余分なメソッド呼び出しを持つ関数呼び出しが発生します。ClojureCLR のバージョン 1.4 (近日公開) では、ほとんどのコード生成で DLR を使用する必要がなくなります。(DLR は、CLR 相互運用とポリモーフィック インライン キャッシュに引き続き使用されます。) この時点で、生成されたコードは JVM バージョンと実質的に同じになります。起動時間は 10% 短縮され、単純なベンチマークではバージョン 1.3 より 4 ~ 16% の改善が見られます。詳細はこちら。
(2) 起動時間 Clojure JVM は Clojure CLR よりも大幅に高速に起動します。このほとんどは、クラス ファイルを選択的にロードできる JVM (アセンブリ全体をロードする CLR とは対照的) と、JIT コンパイルが発生するタイミングの違いに起因しています。ただし、ClojureCLR が NGEN 化されている場合、起動時間は非常に高速です。詳細はこちら。
(3) JVM 対 CLR のパフォーマンス ClojureJVM を HotSpot コンパイラーの最適化で適切に機能させるために、ある程度の注意が払われてきました。明確な証拠はありませんが、HotSpot は、CLR JITter よりも、コンパイルされた Clojure コードのインライン化などで優れた機能を発揮すると推測しています。ClojureCLR で CLR JITter をより有効に活用する方法については、まったく注意が払われていないと言っても過言ではありません。
ClojureCLR 1.4 のリリースは、いくつかのベンチマークの良い機会を提供します。
私は実際にはCLRバージョンを使用していないので、あなたの質問に完全に答えることはできません。
ただし、これまでの最適化/開発作業のほとんどは、ClojureのメインラインJVMバージョンに費やされていることに注意してください。その結果、ClojureのJVMバージョンは、現在ほとんどの状況でかなり優れたパフォーマンスを発揮することが期待できます。
JVM上のClojureは、すでに最も高速な動的型付け言語の1つです。ベンチマークゲームページから、Common Lispは、(わずかに)高速な唯一の動的型付け言語です。
時間の経過とともに、Clojure JVM / CLRのギャップは、両方のバージョンがホストプラットフォームのパフォーマンスに向かう傾向があるため、狭くなると予想されます。ただし、現時点でパフォーマンスが重要な懸念事項である場合は、JVMバージョンを強くお勧めします(パフォーマンスだけでなく、JVMバージョンは、全体的な成熟度、ライブラリの可用性、およびクロスプラットフォームのサポートにも優れている可能性があります)。