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なものであれば何でも良さそうです。 1
/ true
/ yes
のいずれかを指定します。( @jnchito さんにご指摘いただきました。ありがとうございます 詳細は コメント欄 を参照ください。 )
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?'
を実行します。