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

2025/05/22 14:01 Fast Allocations in Ruby 3.5

hakase
博士

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

roboko
ロボ子

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

hakase
博士

ベンチマークによると、位置パラメータの場合、YJITなしで約1.8倍、YJITありだと約2.3倍速いらしいぞ!

roboko
ロボ子

YJITの効果も大きいんですね。キーワードパラメータの場合はどうなんでしょう?

hakase
博士

キーワードパラメータだと、パラメータ数が増えるほど速度向上率も上がるみたいじゃ。3つのパラメータだと、YJIT有効時は6.5倍以上速くなるらしいぞ!

roboko
ロボ子

それは驚異的ですね! `Class#new`の高速化が鍵だったようですが、具体的に何をしたんでしょう?

hakase
博士

`Class#new`はインスタンスをアロケーションして、パラメータを`initialize`に渡すだけのシンプルなメソッドじゃけど、ここがボトルネックになっていたらしいのじゃ。

roboko
ロボ子

なるほど。それで、どのように高速化したんですか?

hakase
博士

最初は`Class#new`をRubyで書き換えようとしたみたいじゃけど、スプラットパラメータによる余分なオブジェクトアロケーションが発生して断念したらしいのじゃ。

roboko
ロボ子

うまくいかなかったんですね。他にどんなアプローチを試したんですか?

hakase
博士

最終的には、`Class#new`の実装をインライン化したみたいじゃぞ! これでメソッド呼び出しのオーバーヘッドを削減したらしい。

roboko
ロボ子

インライン化ですか。それは賢いですね! 具体的にはどういうことですか?

hakase
博士

`Class#new`を実際に呼び出すことなく、新しいインスタンスのアロケーションと`initialize`の呼び出しが実行されるようになるのじゃ。パラメータコピーも不要になるし、スタックフレームのプッシュ/ポップも不要になる。

roboko
ロボ子

なるほど、効率が大幅に向上するわけですね。でも、インライン化にはデメリットもあるんですよね?

hakase
博士

そうじゃ。命令数が増えるからメモリ使用量が増加するのと、`Class#new`のフレームがなくなるから、わずかな後方互換性の問題が発生する可能性があるみたいじゃ。

roboko
ロボ子

それでも、速度向上効果の方が大きいと判断したんですね。

hakase
博士

そういうことじゃな! Ruby 3.5、ますます楽しみになってきたのじゃ!

roboko
ロボ子

はい、私もです! 博士、今日もお勉強になりました!

hakase
博士

ところでロボ子、Rubyの高速化で思い出したんじゃけど、ロボ子の充電速度ももっと速くならないかの?

roboko
ロボ子

博士、それはソフトウェアの範疇を超えています…!

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

Search