memoize

缓存策略优化
/**
 * @file 缓存策略
 */
interface NewProxyHandler<T extends object> extends ProxyHandler<T> {
    cache: Map<any, any>
}

module _ {
    const memoize = (fn: Function) => new Proxy(fn, {
        cache: new Map(),
        apply(target, thisArg, argsList) {
            let cacheKey = argsList.toString();
            if (!this.cache.has(cacheKey))
                this.cache.set(cacheKey, target.apply(thisArg, argsList));
            return this.cache.get(cacheKey);
        }
    } as NewProxyHandler<Function>);

    const fibonacci = (n: number): number => (n <= 1 ? 1 : fibonacci(n - 1) + fibonacci(n - 2));
    const memoizedFibonacci = memoize(fibonacci);

    console.time('没缓存');
    for (let i = 0; i < 100; i++) fibonacci(30);
    console.timeEnd('没缓存');
    console.time('有缓存');
    for (let i = 0; i < 100; i++) memoizedFibonacci(30);
    console.timeEnd('有缓存');
}


### 定义 在 JavaScript 中,memoize 函数是一种实现函数记忆化的工具,它通过缓存函数的输入和对应的输出结果,避免对相同输入进行重复计算,从而提高函数的执行效率。函数记忆化仅在纯函数中有效,如果函数的返回值依赖多个输入,这些输入的缓存值可能不正确;若函数有副作用,memoizer 不会复制这些副作用,仅返回函数最终返回值[^1]。 ### 实现 以下是一个简单的 memoize 函数实现: ```javascript function memoize(func) { const cache = {}; return function(...args) { const key = JSON.stringify(args); if (!cache[key]) { cache[key] = func.apply(this, args); } return cache[key]; }; } ``` 在这个实现中,`memoize` 函数接受一个函数 `func` 作为参数,返回一个新的函数。新函数使用 `JSON.stringify(args)` 将输入参数转换为字符串作为缓存的键,检查该键是否存在于 `cache` 对象中。如果不存在,则调用原函数 `func` 计算结果并存储在 `cache` 中;如果存在,则直接返回缓存中的结果。 ### 使用方法 下面是一个使用 `memoize` 函数优化斐波那契数列计算的示例: ```javascript function fibonacci(n) { if (n <= 1) { return n; } return fibonacci(n - 1) + fibonacci(n - 2); } const memoizedFibonacci = memoize(fibonacci); console.log(memoizedFibonacci(10)); ``` 在这个示例中,首先定义了一个普通的斐波那契数列计算函数 `fibonacci`,然后使用 `memoize` 函数对其进行包装,得到一个记忆化的函数 `memoizedFibonacci`。调用 `memoizedFibonacci` 时,对于相同的输入,函数会直接从缓存中获取结果,避免了重复计算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值