@ledsun blog

無味の味は佳境に入らざればすなわち知れず

Implementing Object Shapes in CRuby

rubykaigi.org

とても緊張してしゃべられてました。 丁寧なスライドで、英語全然わからない僕でも、Object Shapesってそういうものか、なるほどね!ってなったので、とても良かったです。

ていうのを、当日、直接本人に言えやって、いまさら思います。 英語でなんて言ったらいいかわからなくても、DeepLで翻訳した結果くらい見せさられただろうと・・・この記事を書きながら悔しく思っています。

Rubyの内部的にはインスタンス変数は配列に保存されています。 インスタンス変数にアクセスするときは、インスタンス変数名から配列のインデックスに変換します。 現状はハッシュテーブルでインスタンス変数名と対応するインデックスを管理しています。 Object Shapesを導入すると、ポインタを二つくらいたどるだけでインデックスがわかる。 という高速化手法だと理解しました。

その結果YJITで生成される機械語が、2行短くなって、メモリを読む箇所が3箇所から1箇所になるそうです。 どんだけ涙ぐましいチューニングなのか・・・。

計測すると、サブクラスの初期化時のインスタンス変数設定が2倍速くなるとか。 Rubyのクラスはほんとどサブクラスなので、これは効果でそうと期待します。 が、Railsベンチだと2%しか速くならなかったそうです。

めっちゃ頑張って実装したのに2%は悲しいですね。 そりゃ・・・緊張して発表しますわね・・・。

Feature #18776: Object Shapes - Ruby master - Ruby Issue Tracking System に発表と同様の説明があります。 DeepLで翻訳して読んでも、発表とちがってよくわかりません。 動画が公開されるが楽しみです。

20220927 追記

github.com

masterにマージされたようです。パチパチ

20220928 追記

ruby-trunk-changes.hatenablog.com

と思ったら、revertされたみたいです。 GC周りみたいですが・・・よくわかりません。

20220929 追記

ruby-trunk-changes.hatenablog.com

リベンジを果たしたようです。