「1 秒变 1 毫秒」:教你用 JavaScript Memoization 优雅加速计算!
cola 发布于 阅读:80 JavaScript
什么是 Memoization?
Memoization(记忆化) ,又叫 函数记忆 ,是一种 缓存技术 。它的原理非常简单:
对相同的输入参数,只计算一次,把结果缓存下来。下次遇到一样的输入,直接取缓存,再也不用计算啦!
为什么 Memoization 这么香?
- • 提升性能 :耗时计算只做一次,速度提升 10 倍、100 倍不是梦。
- • 无需改变函数核心逻辑 :像“外挂”一样增强你的函数!
- • 简单易用 :几行封装代码,哪里慢贴哪里。
实战案例1:普通递归 VS Memoization 加速
先看最“慢”的写法
function fib(n) {
if (n < 2) return n;
return fib(n - 1) + fib(n - 2);
}
console.time('plain');
console.log(fib(40)); // 慢到想骂人
console.timeEnd('plain');
优雅地 Memoize 一下
function memoize(fn) {
const cache = {};
return function(...args) {
const key = args.join(',');
if (cache[key]) {
return cache[key];
}
const result = fn.apply(this, args);
cache[key] = result;
return result;
}
}
const memoizedFib = memoize(function fib(n) {
if (n < 2) return n;
return memoizedFib(n - 1) + memoizedFib(n - 2);
});
console.time('memoized');
console.log(memoizedFib(40)); // 秒出!
console.timeEnd('memoized');
你会发现,原来要跑几秒甚至更久的递归,memoize 一下就瞬间完成!