web-dev-qa-db-ja.com

どちらが速いですか:MRI RubyまたはJRuby?

RailsでRubyを使用している場合、MRI/YARV RubyまたはJRubyをインストールする必要がありますか?どちらが速いですか?

24
ses

答えは多くの変数に依存します。

しかし、一般的に、Ruby 1.9はJRubyよりも高速ですが、Ruby 1.8はJRubyよりも低速です。

例えば コンピューター言語ベンチマークゲーム によると:

また、アプリケーションがマルチスレッドの場合、 JRubyには標準のRubyよりもいくつかの利点がある場合があります
(a.k.a。MRI)]、コアの数によって異なります。

22
Mikel

最近のベンチマークでは、JRubyが先頭に立っており、MagLev、Rubinius、MRIの順です。

ベンチマークは注意が必要です。 Ruby Benchmark Suite は、Rubyのベンチマークに最もよく使用されるものです。実装全体で失敗したベンチマークを削除すると、次のグラフが表示されます。

RBS

幾何平均を使用したことに注意してください。外れ値と機械仕様を正規化するため、これは平均パフォーマンスのより良い指標です。

実行できる最良のベンチマークはアプリに固有です。全体的なパフォーマンスを求めている場合は、実際のスレッドを使用することをお勧めします。そのため、RubiniusまたはJRubyが唯一の実際の選択肢です。

また、各実装はさまざまな点で高速です。 MRIは非常に起動が速いので、スクリプトに適しています。実行時間の長いアプリケーション(Webアプリケーションなど)の場合、RubiniusまたはJRubyは一般にMRIよりもパフォーマンスが優れています。

23
jc00ke

プログラミングzen.comには、Rubyのさまざまなフレーバーを比較した本当にすばらしい記事があります。昨年7月に公開されたので、まだかなり最近です;)ページでこれらを比較しています:

* Ruby 1.8.7 p299
* Ruby 1.9.1 p378
* Ruby 1.9.2 RC2
* IronRuby 1.0 (Mono 2.4.4)
* JRuby 1.5.1 (Java HotSpot(TM) 64-Bit Server VM 1.6.0_20)
* MagLev (rev 23832)
* Ruby Enterprise Edition 2010.02
* Rubinius 1.0.1

あなたが探しているものをそこで見つけることができるかもしれません

http://programmingzen.com/2010/07/19/the-great-Ruby-shootout-july-2010/

2
2potatocakes

実際、上記の答えはmikelの答えを除いて正しくありません。JVMのベンチマークを観察した場合、それが遅いことがわかるので、CRubyと比較したJRubyのパフォーマンスを想像してください。

個人的に私はMRIRubyの寄稿者であり、MRI VMのYARVRubyが導入されて以来、上記のベンチマークチャートはまったく当てはまらないと思います。このバージョンは最速となり、多くのベンチマークが証明されたため、「PatShaughnessyのベンチマークと3人の有名なRubyインタープリターMRIRuby、JRuby、Rubiniusに関するコメントを参照してください」。したがって、私の意見では、次の論理的な点のために比較のポイントはありません:-

1- Cはハードウェアで直接動作し、マシンコードを生成するため、Javaよりもはるかに高速です。 JVMは中間コードと見なされるバイトコードを生成します。

2-JRubyにはMRIとは異なり追加の解釈ステップが含まれていますRuby "トークン化、解析、AST YARV命令の解析と生成"コード生成 "そして最後にコード実行" JRubyには追加のステージが含まれています。

3-MRIでのガベージコレクションRubyは、JRubyでのガベージコレクションよりもはるかに高速ですが、マークとスイープのガベージコレクション手法にいくつかの変更を加えた方が優れています。

4-あなたが使用したほとんどの企業やテクノロジーをサーフィンした場合、それらは常にMRI Ruby特にRuby 1.9を使用していました。 MRIRubyとは異なります。

最後にRuby 1.8はいAST自体でコードを実行していたため、コードを実行するためにASTを複数回解析するために遅くなりました。

私が何か間違っているなら、誰かが私を訂正してくれることを願っています。

RVMまたはソースからMRI Ruby dudeをインストールします。使用できる宝石や拡張機能がたくさんあります

2
user3719235

多くのユーザーがベンチマークに関してすでに回答しています。あなたの質問は、特にRailsでの使用に関するものです。

質問の目的がはっきりとわからないので、珍しいと思います。 MRIを使用したり、JRubyを使用したりする人は他にもたくさんいます。その点では、速度ではなく、安定性とセキュリティ、保守性を重視します。

ただし、MRIとJRubyの間には重要な違いがあります。

MRIはGILを使用します。つまり、複数のスレッドを持つことができますが、一度にアクティブにできるのは1つのスレッドだけです。また、スレッドの実装は異なるRubyバージョンで異なる可能性があります。新しいバージョンはOSスレッドを使用し(順調に進んでいます)、古いバージョンは代わりにグリーンスレッドを使用します。

MRIには実際の並列処理はありません。

MRIはマルチスレッドであり、スレッドセーフではなく、並列でもありません。

JRubyはマルチスレッドであり、スレッドセーフで並列ではありません。

並列処理は速度に違いをもたらす可能性があります。どちらもスレッドセーフではないため、とにかくそれを処理する必要があります。スピードを求めて並列処理を活用できるのであれば、JRubyに確かにそうです。

繰り返しになりますが、MRIとJRubyのどちらを選択するかを決定する際に、速度が最も重要な要素であるかどうかはわかりません。それは生態系です。あなたがスピードを求めたので、私はこれ以上これに立ち入りません。

2
Ely

正直なところ、それはあなたのコードに依存します。マシンにRVMまたはPikをインストールし、さまざまなバージョンのRubyをインストールして、それらでコードを実行してみてください。

たとえば、頻繁に再起動するアプリケーションは、JRubyがコードを効果的に最適化できるようになるまでに時間がかかるため、JRubyの候補としては適していません。同様に、Ruby 1.8.Xはプロセッサーで複数のコアを利用できないため、スレッドに依存するアプリケーションはRuby 1.8.7には適していません。したがって、一度に複数のスレッドで実行することはできません。

2
PatrickTulskie