Memoization: 该什么时候使用,这个是以空间换速度,所以最好确定你是否值得那么做,有些场景很有必要使用。
在这里,memoization通常会缩短执行时间并影响我们应用程序的性能。当我们知道一组输入将产生某个输出时,memoization最有效。
遵循最佳实践,应该在纯函数上实现memoization。纯函数输入什么就返回什么,不存在副作用。
在处理递归函数时,Memoization最有效,递归函数用于执行诸如GUI渲染,Sprite和动画物理等繁重操作。
Memoization: 什么时候不要使用
不是纯函数的时候(输出不完全依赖于输入)。
使用 Object.create(null) 创建一个没有 Object.prototype 的空对象(这样如果输入值类似 'hasOwnProperty',那么这些属性就不会被解析)。 通过首先检查该特定输入值的函数输出是否已经被缓存,如果没有,则返回一个函数,该函数将作为单个参数提供给 memoized 函数。
const memoize = fn => {
const cache = new Map();
const cached = function(val) {
return cache.has(val) ? cache.get(val) : cache.set(val, fn.call(this, val)) && cache.get(val);
};
cached.cache = cache;
return cached;
};
// See the `anagrams` snippet.
const anagramsCached = memoize(anagrams);
anagramsCached('javascript'); // takes a long time
anagramsCached('javascript'); // returns virtually instantly since it's now cached
console.log(anagramsCached.cache); // The cached anagrams map
网友评论