最近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 } }
使い所の判断が難しそうだけど、使いようによってはかなり高速化出来るかも。