5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ruby3.2+RailsでYJITを有効化

Last updated at Posted at 2023-04-28

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

TL;DR

  • Rustをインストールしてから、Rubyをビルド
  • Rails起動時に環境変数 RUBY_YJIT_ENABLE=1RUBYOPT=--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 さんにご指摘いただきました。ありがとうございます :pray: 詳細は コメント欄 を参照ください。 )
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 stopbundle exec spring stop してから、再度 bin/rails r 'p RubyVM::YJIT.enabled?' を実行します。

5
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?