_.memoize не увеличивает производительность - PullRequest
0 голосов
/ 10 ноября 2019

Рассмотрим нахождение 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? Ака, я хочу, чтобы производительность была такой же:

// 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]
}

1 Ответ

0 голосов
/ 10 ноября 2019

Это не будет быстрее при первом запуске. Мемоизация дает вам только преимущества при последующих казнях.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...