LoginSignup
10
11

More than 5 years have passed since last update.

[JavaScript] lodashのmemoizeで演算結果をキャッシュして高速化

Posted at

最近Node.jsをやっているのでlodashのドキュメントを見ていると、あまり使ったことないFunctionを発見。

_.memoize(func, [resolver])

Creates a function that memoizes the result of func

と書いている。
Functionの処理結果をキャッシュしてくれるらしい。

使ってみる

こんな処理に時間がかかるFunctionがあった場合に

function someCalculateFunc(someValue) {
  var result = {}
    ;

  // 数秒かかる長くて辛い処理

  return result;
}

こんな感じで呼び出すと時間かかる処理でもすごく早くなる

var value = _.memoize(someCalculateFunc)
    ;

// 最初は時間かかるけど
value(someValue1);
// キャッシュされてるので2回目以降は計算結果を取り出すのみ
value(someValue1);
value(someValue1);
value(someValue1);
value(someValue1);

第二引数のresolver・・・なんだろう?

第二引数にはresolverというものが指定されていて、良くわからなかったのであれこで調べてみる。
どうもキャッシュのキーを指定するもののようで、いろいろ試してみると動きがよく分かった。

// 結果をキャッシュしたい関数
function someCalculateFunc(value1, value2) {
  var result = 0
    ;

  // 適当な計算
  for (var i = 0 ; i < 10000 ; i++){
    result += value1 + value2
  }

  return result;
}

// キャッシュキー
function resolver(value1) {
  // 引数には、someCalculateFuncで渡した引数が入ってくる
  // console.log(arguments);

  // ここでは第一引数のものをキャッシュのキーとする
  return value1;
}


var value = _.memoize(someCalculateFunc, resolver)
  ;

for (var i = 0; i < 10; i++) {
  value(500 + i, 999 + i);
}

console.log(value.cache.get(501)); // ->value(501, 1000)のキャッシュが取得できる

valueのcacheの中身を覗いてみると、

console.log(value.cache.__data__.hash);

// ↓このようにkey / valueで保存されている
Hash {
  __data__:
   { '500': 14990000,
     '501': 15010000,
     '502': 15030000,
     '503': 15050000,
     '504': 15070000,
     '505': 15090000,
     '506': 15110000,
     '507': 15130000,
     '508': 15150000,
     '509': 15170000 } }

使い所の判断が難しそうだけど、使いようによってはかなり高速化出来るかも。

10
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
11