美文网首页
JavaScript:memoize全局函数

JavaScript:memoize全局函数

作者: 勇往直前888 | 来源:发表于2017-05-11 15:29 被阅读1186次

    基本概念

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

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

    相关文章

      网友评论

          本文标题:JavaScript:memoize全局函数

          本文链接:https://www.haomeiwen.com/subject/yceotxtx.html