MRI Ruby 1.8 と JRuby の間の異なるスレッド モデルの実際的な影響を理解しようとしています。
開発者である私にとって、この違いは何を意味するのでしょうか?
また、スレッド モデルが異なるため、JRuby でのパフォーマンス特性が低下する MRI Ruby 1.8 のコードの実際の例はありますか?
MRI Ruby 1.8 と JRuby の間の異なるスレッド モデルの実際的な影響を理解しようとしています。
開発者である私にとって、この違いは何を意味するのでしょうか?
また、スレッド モデルが異なるため、JRuby でのパフォーマンス特性が低下する MRI Ruby 1.8 のコードの実際の例はありますか?
2コアCPUで実行されるスレッド化されたプログラムは、スレッド化の観点から、JRubyで他の実装よりも高速に実行されます。
多くの既存のrubyライブラリはスレッドセーフではないため、JRubyの利点は何回も役に立たない。
また、Rubyプログラミングの多くの手法(クラス変数など)では、スレッドを使用する場合、スレッドの安全性(ミューテックスロック、モニターなど)を確保するために追加のプログラミング作業が必要になることに注意してください。
JRuby のスレッドはネイティブ システム スレッドであるため、スレッド化されたプログラミングのすべての利点が得られます (該当する場合は、複数のプロセッサ コアの使用を含む)。ただし、Ruby には Global Interpreter Lock (GIL) があり、複数のスレッドが同時に実行されるのを防ぎます。したがって、唯一の実際のパフォーマンスの違いは、MRI/YARV Ruby アプリケーションがすべてのプロセッサ コアを利用できないという事実ですが、JRuby アプリケーションは問題なく利用できます。
ただし、それが問題にならない場合、MRI のスレッドは (理論的には、これをテストしていません) 少し高速です。これは、使用するシステム リソースが少ないグリーン スレッドであるためです。YARV (Ruby 1.9) はネイティブ システム スレッドを使用します。
私は通常の JRuby ユーザーですが、最大の違いは、JRuby スレッドが完全に並行であることです。これらは実際にはシステムレベルのスレッドであるため、複数のコアで同時に実行できます。JRuby で MRI Ruby 1.8 コードの実行速度が遅い場所を私は知りません。この質問を確認することを検討してください。Ruby には実際のマルチスレッドがありますか? .