web-dev-qa-db-ja.com

Java VMと.NET CLRのベンチマークパフォーマンス

パフォーマンスに基づいてJavaの代わりに.NETを使用するよりも、選択を正当化する必要がありましたか?

以下の操作を実行できる典型的な大量トランザクション処理システムの場合、

  • 同時データベーストランザクション
  • 数学的計算
  • 他のWebサービス(SOAP/XML、XML-RPC)との相互作用

私のアプローチは、さまざまな負荷レベルで上記の操作をベンチマークし、結果を比較する、JVMのJava for .NET CLRの両方でベンチマークテストをコーディングすることです。

言語とプラットフォームの設定はさておき、最終的なパフォーマンス比較を行う方法について聞きたいです Java VMと.NET CLR?

存在する包括的な尊敬されるベンチマークはありますか?

37
bunn_online

JVMとCLRの効率に関する正確な数値はわかりませんが、その差はあるとしても小さいと思われます。

ただし、言語側では、C#にはJavaよりもいくつかの低レベルの構成要素があり、より最適化することができます。

次のような構成:

  • ユーザー定義の値タイプ。割り当てが高速で、メモリのオーバーヘッドがありません(私が正しく覚えていれば、CLRとJVMの両方で参照タイプごとに12バイトです)ベクトルや行列など、自然に値として表現されるものに役立ちます。数学演算です。これをrefおよびoutと組み合わせて、これらの大きな値型の過度のコピーを回避します。

  • もう少し「金属に近い」最適化を可能にする安全でないコードブロック。たとえば、CLRとJVMは状況によっては配列境界チェックを回避できますが、多くの場合は回避できず、すべての配列アクセスで、インデックスがまだ配列の境界内にあるかどうかのチェックが必要です。ここで安全でないコードを使用すると、ポインタを使用して配列のメモリに直接アクセスし、境界チェックを回避できます。これは大幅な節約を意味します。そして、非常に低レベルの側には、スタックに配列を直接割り当てることができるstackallocもありますが、通常の配列は、低速ですがより便利なヒープに割り当てられます。個人的には、stackallocの実用的なアプリケーションを知りません。

  • Javaの型消去ジェネリックとは異なり、不要なキャストやボクシングを回避する真のジェネリック。しかし、これがJavaプログラムの問題である場合は、追加の作業(たとえば、_ArrayList<Integer>_から内部で_int[]_バッファ。)

これはすべてC#に偏っているように思われ、C#にはパフォーマンス向上に役立つより優れた低レベルの言語構成体があると思います。ただし、これらの違いが本当に重要であることは疑わしい(そして、それらはあなたのケースでは当てはまらないかもしれません、あなたが行うすべてがデータベースアクセスである場合、ポインタを使用しても何も得られません、ここでJavaが高速かもしれません)他の方法(クロスプラットフォームへの移行など)であなたを妨げます。小さなパフォーマンスの違いではなく、要件に一致するプラットフォームである正確さを求めます。

35
JulianR

Java VMと.Net CLRは夢のようなものです。複雑なシステムを設計する場合は常に妥協が必要になるため、常に他よりも見栄えのよいパフォーマンステストを行うことができます。ベンチマークのタイプをランタイムに絞り込む場合速度とメモリは、次のような記事を見つける可能性があります: http://www.codeproject.com/KB/dotnet/RuntimePerformance.aspx これは、決して議論の終わりではありません。

3
dmihailescu

言語とプラットフォームの設定はさておき、Java VMと.Net CLRとの間で決定的なパフォーマンス比較を行う方法を教えてください。

2つのVMとそれらの標準ライブラリのさまざまな異なる特性を比較できるように設計された一連のベンチマークを作成します。私の専門はテクニカルコンピューティングであるので、以下をお勧めします。

  • レジスタ整数演算で、例えばフィボナッチ。
  • レジスターの浮動小数点演算。マンデルブロ。
  • 配列の反復。 FFT。
  • 割り当て、例えば純粋に機能する赤黒木。
  • Intまたはfloatキーと値を持つハッシュテーブル。
  • 文字列のキーと値を含むハッシュテーブル。
  • 文字列。
  • 正規表現。
  • ファイルIO。

おそらく、データベースやWebサービスについても同様のことが考えられます。

CLRの上にある言語には、まったく異なるプロパティがあることを忘れないでください。たとえば、F#言語のinlineを使用すると、最適化を自動化して、C#よりもパフォーマンスを大幅に向上させることができます。逆に、C#のgotoを使用すると、F#の場合よりも効率的にいくつかのことができ、構造体の最適化はF#よりもC#の方が効果的でした(最後に確認しました)。

存在する包括的で尊敬されるベンチマークはありますか?

いいえ、しかし、より興味深いので、外れ値に焦点を当てた散在するベンチマークがたくさんあります。たとえば、 このブログ投稿 は、単純な汎用ハッシュテーブルのベンチマークが.NETのF#でJava JVMの場合)よりも17倍高速になる理由を説明しています。その場合その理由は、値型と具体化されたジェネリックにより、JVMよりも.NETではるかに効率的なジェネリックハッシュテーブル実装を作成できるようになったためです。

2
Jon Harrop

ベンチマーク...ニーズに合ったテストでほぼすべてのことを証明できます。
チャック・ノリスを除く。チャックノリスは、Xが選択した場合、Xよりも低速で高速です。

別のポイント。 Javaの方が速いという結論に達したとします。それは2年後もまだ速いということを意味しますか?

Javaが5%高速で、.NETが10%簡単である場合、どちらを選択しますか?
多くの要因があり、パフォーマンスはそれらの1つにすぎません。そして、差が小さい場合(私はそうだと思います)、それはおそらく最も重要なものではありません。

パフォーマンスが非常に重要なものを構築している場合を除きます。

1
Petar Repac

ええ、それはかなり包括的であり、あなたが多くの異なるものを比較することを可能にするベンチマークゲームがあります。

http://shootout.alioth.debian.org/

唯一のことは、ビジュアルスタジオではなくモノラルを使用することですが、2つのパフォーマンスの違いはごくわずかです。

一般的にJavaは通常、少し高速ですが(何をしているのかによります)、はるかに大きなメモリフットプリントを使用し、どちらもほぼ同じソースサイズです。

1
user133018

ちなみに、最初にマイクロソフトに連絡して承認を得ることなく、あらゆる形式のベンチマークに.NETフレームワークコードを使用することは特に許可されていません。

もしあなたが何かを出版したいのなら、私はあなたに知らせたいと思いました。

メモリから、MSは本屋、ペットショップで、Java=が最初に、同じタスクでソフトウェアがどのように効果的に機能するかを示しました。私はそれを考えています。

。NETペットストア

1
Spence

私はどちらがより良いパフォーマンスを与えるのかと思っていました。しかし、これについてベンチマークテストを実行する方法についてはわかりません。

とても良い質問です-うまくいけば、ここですべてのガイダンスが得られます。

このベンチマークテストは "割引"ベンチマークテストアプローチ(1人の開発者によるセットアップと実行が容易)である必要があると思いますか?

私は誰かがこの種の情報を持っているといいですね。テクノロジーを自分で短時間で評価するように依頼されることがよくあります。

素敵な1つbunn_online!

1
Forer