TL;DR

関数の呼び出し結果を保存しておき、同じ引数で呼ばれたときは再計算せずに保存した値を返す最適化の技法。キャッシュの限定的な形の 1 つである。

なぜ必要か

Wikipedia によると、メモ化は主に処理速度を上げるために使う。計算時間を減らす代わりに、記憶領域の使用量を増やす手段である。構文解析で、バックトラッキングによる再計算を防ぐためにも使われる。

仕組み

Wikipedia によると、結果は連想配列などのルックアップテーブルに、引数をキーにして保存する。保存は、その結果が初めて必要になったときに行われる。コンパイル時に行う最適化と違い、実行時に行われ、特定のプラットフォームに依存しない。

例

Wikipedia は階乗の関数を例に挙げている。最初に 5 で呼ぶと 0 から 5 までの結果が保存されるので、その後に 7 で呼んだときの再帰呼び出しは 7 と 6 の 2 回で済む。

React では、React.cache が渡された関数をメモ化する。Next.js の Request Memoization は、同じ URL とオプションを持つ fetch リクエストを自動でメモ化する。

注意点

Wikipedia によると、メモ化できる関数は参照透過である必要がある。つまり、同じ入力に対して常に同じ結果を返し、副作用を持たない関数でなければならない。

関連

出典