【めもか】

メモ化 とは?

💡 計算結果を「メモして」使い回す
📌 このページのポイント
メモ化 ― 計算結果をキャッシュして高速化 メモ化なし fib(5) を呼び出し → fib(4) + fib(3) → fib(3) + fib(2) + fib(2) + fib(1) → 同じ計算を何度も繰り返す… 計算回数: 15回 メモ化あり fib(5) を呼び出し → fib(4) + fib(3) [キャッシュ] → fib(3) [キャッシュ] + fib(2) → 2回目以降はキャッシュから取得! 計算回数: 5回 キャッシュ(メモ)テーブル fib(1) → 1 fib(2) → 1 fib(3) → 2 fib(4) → 3 fib(5) → 5
メモ化のイメージ
ひよこ ひよこ

キャッシュとメモ化の違いは?

ペンギン先生 ペンギン先生

概念的には似ているけど、メモ化は「関数の引数→戻り値」の対応を記憶する特定のキャッシュ手法。キャッシュはもっと広い概念で、HTTPキャッシュやDBクエリキャッシュなど様々。メモ化は「同じ入力には同じ出力を返す純粋関数」に適用するのが基本で、副作用がある関数には使えないよ

ひよこ ひよこ

フィボナッチ数列での効果は?

ペンギン先生 ペンギン先生

素朴な再帰でfib(50)を計算すると2^50回近い関数呼び出しが必要で、実質的に計算不能。メモ化するとfib(1)〜fib(50)の50回分の計算結果を記憶して再利用するから、O(n)で完了する。指数関数的な計算量が線形になるのは劇的な改善だよ

ひよこ ひよこ

おもしろい!Reactのメモ化は?

ペンギン先生 ペンギン先生

React.memo()はコンポーネントのpropsが変わらなければ再レンダリングをスキップする。useMemo()は計算結果をメモ化して、依存配列が変わった時だけ再計算する。useCallback()は関数自体をメモ化する。ただし何でもメモ化すればいいわけじゃなく、メモ化のオーバーヘッドが計算コストを上回ることもあるから注意だよ

ひよこ ひよこ

メモ化が不適切な場合は?

ペンギン先生 ペンギン先生

引数のパターンが膨大でキャッシュヒット率が低い場合、②関数の計算コストが小さくてメモ化のオーバーヘッドの方が大きい場合、③副作用がある関数(DB書き込みなど)、④メモリ制約が厳しい環境。特にWebアプリでは無制限にメモ化するとメモリリークの原因になるから、LRUキャッシュで上限を設けるのが安全だよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「メモ化」って出てきたら「計算結果を記憶して再利用する最適化」と思えればだいたいOK!
📖 おまけ:英語の意味
「Memoization」 = メモ化
💬 Memo(メモ・覚え書き)から派生。計算結果をメモしておいて再利用するよ
← 用語集にもどる