.NET / MonoのパフォーマンスはJVMと比較してどうですか?
-
05-07-2019 - |
質問
私はしばらくこれを考えていました。答えを裏付ける定量的なデータを提供してください。
関連:Windows、Mac、およびLinux JVMのパフォーマンスに大きな違いはありますか?
解決
Shudoは比較を行いました、linpack、Scimarkなどのマイクロベンチマークのソースコードをリリースしました。
linpackのサンプル結果:
(ソース: shudo.net )
しかし、最後の更新は5年以上前-明らかに.NET V1.0またはv1.1を使用しており、ほとんどがJVM v1.4を使用しています。つまり、Javaと.NETの両方でいくつかのリリースが古くなっています。ソースを取得して、独自の結果を生成できます。
これをやったばかりです-linpack.javaとlinpack.csをダウンロードし、コンパイルして実行しました。 SunのJava v1.6.0.11とMicrosoftのC#3.0(3.5コンパイラ)を使用しました。 Windows Vistaの両方。
linpackの問題サイズが2000の場合、Javaバージョンでは17.6秒、C#バージョンでは17.78秒になりました。
その後、もう一度実行して、Javaで18.14秒、C#で17.31秒を取得しました。
何を測定していますか
これは、パフォーマンスの測定とテストにおけるいくつかの課題を示しています。
-
最初:
単一の試験では意味のある結論を引き出すのに十分ではありません。通常、多くの試行を測定してから、結果を平均する必要があります。 -
2番目:
何を測定していますか?単一の問題を解決するための単一のトライアルを実行する場合、プロセスを開始するコストは、JIT時間と同様に時間に含まれ、バッファーを埋めるためのコストも含まれます。これは、実際に測定したい場合とそうでない場合があります。多くの場合、測定したい定常状態のパフォーマンスです。たとえば、サーバープロセスでは、一度起動すると数か月実行されます。したがって、起動コストはごくわずかであり、測定して最適化するのは、最小平均応答時間での要求スループットです。または、「Fat Client」では、必要なのはビデオ処理に必要な時間であり、プロセスの起動コストを測定する必要はありません。
-
3番目:
ワークロードは何ですか? LinpackとScimarkは、多くの浮動小数点演算を行う場合に興味深いかもしれません。しかし、そうしないとどうなりますか?大量のXMLシュレッディング、文字列解析、整数演算、データベース相互作用、またはHTMLページ生成を行うとどうなりますか。コードで多くのスレッド管理を行う場合、またはスレッド同期プリミティブを使用する場合はどうなりますか?通信とIOはどうですか?トランザクションの重要な部分が暗号化、またはデジタル署名の作成と検証の場合はどうなりますか?これらのベンチマークでは、他のシナリオについては何もわかりません。そのため、それらをマイクロベンチマークと呼ぶかもしれません。評価する対象を正しくモデル化するベンチマークが必要です。
他のヒント
The Computer Language Shootout をご覧ください。これらは、 Monoを含む、多数の言語とVMを比較します。およびJVM 。
デスクトップの起動速度、メモリ、CPU使用率を確認する場合は、 this は2010年7月現在の最新リリースを使用しているので役立つ可能性があります