Ruby3.2+Rails7.0でYJITを有効化してみました。

TL;DR

    • Rustをインストールしてから、Rubyをビルド

 

    Rails起動時に環境変数 RUBY_YJIT_ENABLE=1 や RUBYOPT=–yjit を設定

手順

Rustインストール

Ruby3.2ではビルド時にRustコンパイラ(rustc)が検出されると、自動的にYJITを含めてくれます。そのため最初にRustをインストールします。

Rustのインストール手順は省略しますが、一通り済んだら正常にインストールできたか確認します。

$ rustc --version
rustc 1.69.0 (84c898d65 2023-04-16)

Rubyインストール

詳細は省略しますが、いつもと同じ様にRuby3.2をインストールします。ここではrbenv(+ruby-build)を使用しています。
前述の通り、自動的にRust版YJITを含めてくれるので、 RUBY_CONFIGURE_OPTS 等の指定は不要です。

$ rbenv install -v 3.2.2

インストールできたらYJITを有効化できるか確認します。
以下のように +YJIT と出力されていればOKです。

$ ruby --jit -v
ruby 3.2.2 (2023-03-30 revision e51014f9c0) +YJIT [arm64-darwin22]

Rails設定

RailsアプリケーションでもYJITが有効となるように環境変数を設定します。
RUBY_YJIT_ENABLEを使用する場合、その値はRubyでtruthyなものであれば何でも良さそうです。
RUBYOPTを使用する場合は、rbenvでも同環境変数が使われるため上書きしてしまわないように注意が必要です。

$ export RUBY_YJIT_ENABLE=1
# OR
$ export RUBYOPT=--yjit

ちなみに、 dotenv-rails gemを使用して環境変数を .envファイルにまとめて管理しているケースも多いかと思いますが、この方法ではYJITは有効になりません。
(まずrubyが起動されてから .env ファイルが読み込まれるため)

設定が終わったらYJITが有効化されるか確認します。
以下のように true と出力されていればOKです。

$ bin/rails r 'p RubyVM::YJIT.enabled?'
true

springを使用している場合は環境変数が反映されないと思います。
その場合は bin/spring stop や bundle exec spring stop してから、再度 bin/rails r ‘p RubyVM::YJIT.enabled?’ を実行します。

bannerAds