Object Shapes
実装によるメリット
実行時チェックの減少
https://www.youtube.com/watch?v=So-KvN3p-eE
解決したかった課題
Rubyはとても動的なのでインスタンス変数の宣言が自由で、アクセス時にもコストが高い インスタンス変数にアクセスするたびにハッシュルックアップを実行する必要があった
インラインキャッシュはVMバイトコード内の小さなメモリ領域で、計算結果を保存して、毎回実行するのを避ける メソッドが1つのクラスのみを処理する場合、インスタンス変数インデックスを1回検索するだけで済む
以降の実行では、キャッシュされたクラスと現在のオブジェクトクラスを比較するだけで済み、一致する場合は、キャッシュされたインデックスを直接再利用できる
インデックスを検索するよりもはるかに高速
このインラインキャッシュはクラス名をキャッシュキーにするので、同じ構造を持つが異なるクラスの場合は低速になる
最適化の恩恵を受けやすい記述
attr_*メソッドは最初に呼び出されるまでインスタンス変数を定義しないので、attr_*や、関連するインスタンス変数は#initializeでも宣言する必要がある
nilではなくNULL定数でメモ化する
ohbarye.icon 正直、可読性は低くなる
code:ruby
class GroceryStore
NULL = Object.new
NULL.freeze # 絶対に必要というほどではないが、Ractorセーフになる
def initialize
@fruit = NULL
end
def fruit
return @fruit unless @fruit == NULL
@fruit = an_expensive_operation
end
end