JavaScriptでのメモ化

JavaScriptでのメモ化の概要

メモ化は、アプリケーションを大幅に高速化するための1つの手法です。

これはJavaScriptに固有の手法ではありませんが、JSの例をいくつか紹介するため、この投稿に「JavaScript」のタグを付けました。

メモ化とは、関数呼び出しの実行後に関数呼び出しの結果を関数自体に保存することです。次回関数を呼び出すと、「通常の」実行をもう一度実行する代わりに、保存された結果が返されます。

それは関数用のキャッシング

なぜこれが便利なのですか?

関数の実行に1秒かかり、キャッシュによってプロセスを2ミリ秒に高速化できるとします。ここには明らかな利益があります。

かなりクールに聞こえます。キャッチはどこにありますか?

同じ引数のセットを使用して関数を呼び出した結果が同じ出力になる場合、メモ化は機能します。言い換えれば、関数はピュア。そうしないと、結果をキャッシュしても意味がありません。

そのため、データベースクエリ、ネットワークリクエスト、ファイルへの書き込み、その他の非純粋な操作は、メモ化では最適化できません。それらのために、あなたはそれらを最適化する他の方法を見つける必要があるでしょう。または単に彼らの非効率性で生きる、それは時々避けられない。

1つの例を作成しましょう:

// Calculate the factorial of num
const fact = num => {
  if (!fact.cache) {
    fact.cache = {}
  }
  if (fact.cache[num] !== undefined) {
    console.log(num + ' cached')
    return fact.cache[num];
  } else {
    console.log(num + ' not cached')
  }
  fact.cache[num] = num === 0 ? 1 : num * fact(num - 1)
  return fact.cache[num]
}

数の階乗を計算します。初めてfact()実行されると、cache関数自体のオブジェクトプロパティ。計算結果を格納する場所。

すべての呼び出しで、番号の結果が見つからない場合cacheオブジェクト、計算を実行します。それ以外の場合は、それを返します。

それを実行してみてください。テストを簡単にするためにCodepenを作成しました。document.write()HTMLページに印刷する(初めて使用したときdocument.write()時代は変わりましたが、今回は役に立ちました)。

ペンを見るメモ化の例階乗フラビオ・コープス(@flaviocopes) オンCodePen

Tech Wiki Online!