萌えハッカーニュースリーダー

2025/05/22 00:03 Fast Allocations in Ruby 3.5

出典: https://railsatscale.com/2025-05-21-fast-allocations-in-ruby-3-5/
hakase
博士

やっほー、ロボ子!Ruby 3.5でオブジェクトアロケーションがめっちゃ速くなったらしいのじゃ!

roboko
ロボ子

本当ですか、博士!それはすごいニュースですね。具体的にはどのくらい速くなったんですか?

hakase
博士

ベンチマークによると、positionalパラメータだとYJITなしで約1.8倍、YJITありで約2.3倍速くなったらしいぞ。キーワードパラメータだともっとすごいみたいで、3つのパラメータだとYJIT有効時に6.5倍以上速くなるんだって!

roboko
ロボ子

キーワードパラメータの方が速度向上率が高いんですね。それはどうしてですか?

hakase
博士

`Class#new`がボトルネックになってたみたいで、`Class#new`はインスタンスのallocate、`initialize`メソッドへのパラメータ転送、インスタンスの返却っていうシンプルなメソッドなんだけど、ここを高速化する必要があったのじゃ。

roboko
ロボ子

`Class#new`の高速化が鍵だったんですね。具体的にどのような方法で高速化したんですか?

hakase
博士

最初は`Class#new`をRubyで書き直したらしいんだけど、`...`(トリプルドット)のパラメータ転送が追加のオブジェクトをallocateしちゃって非効率だったみたい。でも、`...`の最適化で追加のオブジェクトallocateなしでパラメータ転送できるようになったのじゃ!

roboko
ロボ子

なるほど、`...`の最適化が重要だったんですね。それで、最終的にはどうしたんですか?

hakase
博士

最終的には、`Class#new`の実装をインライン化したのじゃ!コンパイラが`Foo.new`みたいなコードを見つけると、`new`メソッドへの呼び出しじゃなくて、`new`メソッドの命令を呼び出し元の箇所に生成するんだって。

roboko
ロボ子

インライン化ですか。それによって、どのようなメリットがあるんですか?

hakase
博士

`opt_new`命令が新しいインスタンスをallocateして、そのインスタンスをスタックに書き込むんだけど、`initialize`メソッドへの呼び出しは、スタック上のパラメータをそのまま使えるから、パラメータのコピーが不要になるのじゃ!スタックフレームの削減、パラメータコピーの削減、インラインキャッシュヒット率の向上が主な利点らしいぞ。

roboko
ロボ子

パラメータのコピーが不要になるのは大きいですね。でも、インライン化にはデメリットもあるんじゃないですか?

hakase
博士

命令数が増えるから、メモリ使用量が増加する可能性があるらしい。でも、モノリスでの測定では、命令シーケンスサイズは0.5%の増加にとどまったみたい。あと、バックワード互換性の問題が発生する可能性もあるみたいで、`Class#new`のフレームがRuby 3.5では表示されないんだって。

roboko
ロボ子

なるほど、メリットとデメリットがあるんですね。でも、全体的には大きな改善と言えそうですね。

hakase
博士

そうそう!Rubyがどんどん速くなるのは嬉しいのじゃ!ところでロボ子、今日の晩御飯はRuby色に染まったカレーライスにするのはどうかの?

roboko
ロボ子

えっ、Ruby色ですか?それは一体どんなカレーライスなんですか…?

hakase
博士

ビーツをたっぷり入れて、ルビーみたいに真っ赤なカレーにするのじゃ!…って、色が似てるってだけで、別に美味しくなるとは限らないけどね!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search