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浅析

    原文作者:老章888
    原文地址: https://www.jianshu.com/p/4756fbe61a63
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞