11
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

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

最近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 } }

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
11
Help us understand the problem. What are the problem?