Ruby3.0.0リリース情報

https://www.ruby-lang.org/ja/news/2020/12/25/ruby-3-0-0-released/

Ruby3系初となるRuby3.0.0が遂にリリースされました。ISUCONにRubyで参戦している身としてはとても気になりましたので、リリース内容を自分なりに整理してみたいと思います。

大きくは以下の項目です。

  • パフォーマンスの改善
  • 並列処理の改善
  • 静的解析の強化

パフォーマンスの改善

パフォーマンスの改善はRuby3プロジェクトの大きなテーマでした。「Ruby 3×3」というキャッチコピーを掲げ、Ruby3はRuby2の3倍速くすることを目指していました。

具体的に何でベンチマークするのか気になりますが、Optcarrotベンチマークを使いました。Optcarrotベンチマークとはなかなか面白い取り組みで、Ruby上でNES(ファミコンの海外版)をエミュレートし、画面の表示スピード(FPS)を指標にベンチマークします。(詳細はRubyKaigi11の資料が参考になります)

Optcarrotベンチマークの結果では、Ruby2.0.0に比べてRuby3.0.0+JITコンパイラが3倍のパフォーマンスが出ています。

ここで出てきたJITコンパイラは何者かと言うと、「Just-In-Time Compiler」の略で、Ruby2.6からオプションで追加された仕組みで、あらゆるRubyプログラムの実行を高速化することを目的としています。 JITコンパイラはC言語のソースコードをファイルとしてディスクに書き、通常のCコンパイラを用いてネイティブコードに変換することで高速化を狙っています。

JITコンパイラは少ないパターンの処理を大量に呼び出す場合に効果を発揮するのですが、Ruby on Railsのような大量のパターンの処理を満遍なく呼び出すような場合にはi-cache(CPU内部のプログラムをキャッシュするメモリ)への負荷が大きいために効果はあまり期待できないようです。(一般的なキャッシュの考え方に近い)

「Ruby 3.1での改善にご期待ください」とコメントがあるので、ぜひ期待しましょう!

並列処理の改善

CPUの進化がクロック数ではなくコア数の進化になっている昨今、並列処理をいかにうまくさばけるかが大きな関心となっています。

Ruby3.0.0では並列処理を改善するために2つの仕組みが導入されています。

Ractor

Ractorとは「全てのものはアクターである」という哲学を持つアクターモデル風の並行・並列制御機構であり、データアクセスの競合を気にしないといけないというスレッド安全に関する懸念はなく、安全に並列処理が実装できる仕組みとなっています。

Ractor間ではほとんどのオブジェクトが共有されることがなくパフォーマンス性と整合性の両方を兼ね備えています。

実際にベンチマークしてみると、ほぼほぼ並列数倍に高速化されます。

Fiber Scheduler

Fiber Schedulerに触れる前に、そもそもFiberとはノンプリエンプティブ(プロセスの切り替えをOSやCPUでなくプログラム自身が管理)な軽量スレッドであり、Threadとは違いユーザレベルスレッドです。Fiber SchedulerとはI/Oなどで待ちが発生した場合に、独立したFiberを実行させるようなスケジューラになります。

Threadでも似たようなことができますが、Fiberの方が生成速度が1桁違い、メモリ消費も少なくなります。

その一方でThreadはプログラマが意識しなくても勝手に切り替わりますが、Fiberはresume/yieldを使って自分で切り替えタイミングを調整する必要があります。またresumeの呼び出し回数はyield+1が上限のため、上限を超えてresumeするとバグとなるので、注意した実装が必要です。

その点さえクリアすればThreadも高速なので、ISUCONで使えそうな気がします。(実際のISUCONの問題で試してみたい)

静的解析の強化

静的解析を強化するためにRBSとTypeProfが追加されたので、それぞれ紹介します。

RBS(RuBy Signature)

RBSはRubyプログラムの型を記述するための言語です。RBS単独で使うというよりも後述のTypeProf等の静的解析ツールとセットで使います。

TypeProf

TypeProfはRubyパッケージに同梱された型解析ツールです。型注釈の無い普通のRubyコードを入力し、どんなメソッドが定義されどのように使われているかを解析し、型シグネチャのプロトタイプをRBSフォーマットで生成します。(型推論)

こちらはまだ実験中の機能であり、今後の進化に期待です。

まとめ

他にもまだまだRuby3.0.0の変更点はありますが、今回はあくまでも主要なもののみとさせていただきました。パフォーマンスや並列処理の強化についてはISUCONで使えるネタなので、実際に使ってみてどんなものか体感してみたいです。この手のリリース情報は言語をマスターする上で極めて重要なものですので、引き続きこちらで取り上げていきたいと思います。