7

MRI Ruby 1.8 と JRuby の間の異なるスレッド モデルの実際的な影響を理解しようとしています。

開発者である私にとって、この違いは何を意味するのでしょうか?

また、スレッド モデルが異なるため、JRuby でのパフォーマンス特性が低下する MRI Ruby 1.8 のコードの実際の例はありますか?

4

3 に答える 3

11

  • ruby 1.8にはグリーンスレッドがあり、これらは(オブジェクトとして)作成/削除が高速ですが、実際には並列で実行されず、オペレーティングシステムではなく仮想マシンによってスケジュールされます。
  • ruby 1.9には実際のスレッドがあり、OS呼び出しのために(オブジェクトとして)作成/削除するのに時間がかかりますが、一度に1つのスレッドしか実行できないGIL(グローバルインタープリターロック)のため、どちらも真に並列ではありません
  • JRubyにはOSによってスケジュールされた実際のスレッドもあり、真に並行しています

結論

2コアCPUで実行されるスレッド化されたプログラムは、スレッド化の観点から、JRubyで他の実装よりも高速に実行されます。

知らせ!

多くの既存のrubyライブラリはスレッドセーフではないため、JRubyの利点は何回も役に立たない。
また、Rubyプログラミングの多くの手法(クラス変数など)では、スレッドを使用する場合、スレッドの安全性(ミューテックスロック、モニターなど)を確保するために追加のプログラミング作業が必要になることに注意してください。

于 2010-03-03T15:29:14.857 に答える
6

JRuby のスレッドはネイティブ システム スレッドであるため、スレッド化されたプログラミングのすべての利点が得られます (該当する場合は、複数のプロセッサ コアの使用を含む)。ただし、Ruby には Global Interpreter Lock (GIL) があり、複数のスレッドが同時に実行されるのを防ぎます。したがって、唯一の実際のパフォーマンスの違いは、MRI/YARV Ruby アプリケーションがすべてのプロセッサ コアを利用できないという事実ですが、JRuby アプリケーションは問題なく利用できます。

ただし、それが問題にならない場合、MRI のスレッドは (理論的には、これをテストしていません) 少し高速です。これは、使用するシステム リソースが少ないグリーン スレッドであるためです。YARV (Ruby 1.9) はネイティブ システム スレッドを使用します。

于 2009-06-16T03:56:09.007 に答える
3

私は通常の JRuby ユーザーですが、最大の違いは、JRuby スレッドが完全に並行であることです。これらは実際にはシステムレベルのスレッドであるため、複数のコアで同時に実行できます。JRuby で MRI Ruby 1.8 コードの実行速度が遅い場所を私は知りません。この質問を確認することを検討してください。Ruby には実際のマルチスレッドがありますか? .

于 2009-06-16T03:50:33.153 に答える