【问题标题】:_.memoize does not increase performance_.memoize 不会提高性能
【发布时间】:2019-11-09 23:12:48
【问题描述】:

考虑找到第 n 个斐波那契数。原始函数 fib(32)_.memoize(fib)(32) 花费相同的时间。

function fib(num) {
    if (num <= 1) return 1;
    return fib(num - 1) + fib(num - 2);
}

// slow
console.time('with memo')
_.memoize(fib)(32)
console.timeEnd('with memo')

// slow
console.time('no memo')
fib(32)
console.timeEnd('no memo')

您会看到两者花费的时间大致相同。 没有性能改进。 有没有办法改变memoize 函数来创建一个真正的记忆,相当于在fib 内部实现记忆? Aka,我希望性能与以下相同:

// true memoization, actual performance improvement
// very fast!
cache = {}
function fib(n) {
    if (!cache[n]){
        if (n <= 1) cache[n] = 1;
        else cache[n] = fib(n - 1) + fib(n - 2);
    }
    return cache[n]
}

【问题讨论】:

    标签: javascript node.js underscore.js lodash memoization


    【解决方案1】:

    第一次运行它不会更快。记忆化只会给您后续执行带来的好处。

    function fib(num) {
        if (num <= 1) return 1;
        return fib(num - 1) + fib(num - 2);
    }
    
    const fibmem = _.memoize(fib);
    
    fibmem(32);
    console.time('with memo')
    fibmem(32);
    console.timeEnd('with memo')
    
    fib(32);
    console.time('no memo')
    fib(32)
    console.timeEnd('no memo')
    

    这给了我:

    with memo: 0.0732421875ms
    no memo: 25.131103515625ms
    

    【讨论】:

    • 有没有办法让memoize 实际修改函数以实现最佳性能提升?
    • 这正是这里所做的——fibmem 函数是一个经过修改的函数,它在第一次运行后确实可以提高速度(使用相同的参数)。
    猜你喜欢
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    相关资源
    最近更新 更多