JavaScript:memoize全局函数

基本概念

  • 简单讲就是把函数的计算结果缓存起来。这个对于计算量大的递归调用,可以加快速度。比如阶乘,斐波那契数组数组等。

  • 第1次计算,还是耗时的,因为没有缓存;从第2次开始,可以不经过计算,直接从缓存中拿结果,速度很快。

  • 对于递归函数,缓存的是最终结果,而不是中间过程。比如计算10的阶乘,最终缓存的是10的阶乘的结果。中间过程1 ~ 9的阶乘结果不缓存。也就是调用10的阶乘之后再调用9的阶乘,还是算第一次计算。

实现代码

文件名:memoize.js

const memoize = function(fn) {
    const cache = {};
    return function() {
        const key = JSON.stringify(arguments);
        var value = cache[key];
        if(!value) {
            console.log('新值,执行中...');         // 为了了解过程加入的log,正式场合应该去掉
            value = [fn.apply(this, arguments)];  // 放在一个数组中,方便应对undefined,null等异常情况
            cache[key] = value;
        } else {
            console.log('来自缓存');               // 为了了解过程加入的log,正式场合应该去掉
        }
        return value[0];
    }
}

module.exports = memoize;

测试代码

文件名: memoize_test.js

const memoize = require('./memoize.js');
const log = console.log;

// 斐波那契数组
const fibonacci = (n) => {
    return n < 2 
        ? n
        : fibonacci(n - 1) + fibonacci(n - 2);
};

const memoizeFibonacci = memoize(fibonacci);

log(memoizeFibonacci(45));   // 新值,执行中...;    1134903170  // 等待时间比较长
log(memoizeFibonacci(45));   // 来自缓存;    1134903170
log(memoizeFibonacci(45));   // 来自缓存;    1134903170
log(memoizeFibonacci(45));   // 来自缓存;    1134903170
log(memoizeFibonacci(45));   // 来自缓存;    1134903170

参考文章

js Memoization 优化运行速度

Javascript Memoizer浅析



转载:https://www.jianshu.com/p/4756fbe61a63

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值