记忆不按预期工作?

时间:2017-08-13 17:06:37

标签: javascript node.js v8

我目前正在学习记忆。作为一个简单的练习,我用斐波那契实现了记忆。但是我遇到的问题是,为什么当我不重命名memoized函数时,完成它比重命名它要慢。看看代码。

这不能正常工作,也不能正确缓存。

function memoize(func) {
  const cache = {};

  return function(args) {
    const cacheKeys = Object.keys(cache).map(el => +el);
    if (cacheKeys.includes(args)) {
      return cache[args];
    }
    cache[args] = func(args);
    return cache[args];
  };
}

function wrapped_fibonacci(n) {
  if (n <= 2) {
    return 1;
  }
  return wrapped_fibonacci(n - 1) + wrapped_fibonacci(n - 2);
}

const fibonacci = memoize(wrapped_fibonacci); // <== I do not rename the function.

for (let i = 1; i <= 40; i++) {
  console.log(fibonacci(i));
}

然而,当我像这样编写代码时。它工作正常并且是高效的

function memoize(func) {
  const cache = {};

  return function(args) {
    const cacheKeys = Object.keys(cache).map(el => +el);
    if (cacheKeys.includes(args)) {
      return cache[args];
    }
    cache[args] = func(args);
    return cache[args];
  };
}

function fibonacci(n) {
  if (n <= 2) {
    return 1;
  }
  return fibonacci(n - 1) + fibonacci(n - 2);
}

fibonacci = memoize(fibonacci); //<== I rename the function

for (let i = 1; i <= 40; i++) {
  console.log(fibonacci(i));
}

如你所见。我只是重新分配了函数名称。 我在node.js v8.3.0

上进行了这些测试

第一个结果就是这样。

time node fib.js

real    0m2.413s                                                                                                       │~                                                                                                                     
user    0m2.400s                                                                                                       │~                                                                                                                     
sys     0m0.008s 

第二个结果就是这样

time node fib.js

real    0m0.263s                                                                                                       │~                                                                                                                     
user    0m0.252s                                                                                                       │~                                                                                                                     
sys     0m0.008s  

1.8S差异

任何人都可以对此有所了解吗?

1 个答案:

答案 0 :(得分:1)

在工作示例中,您使用也称为fibonacci的记忆功能替换fibonacci。递归调用正在使用此memoized函数,因为fibonacci-the-original已替换为fibonacci-the-memoized

在非工作示例中,您要从fibonacci创建一个记忆功能wrapped_fibonacci,但该功能仍会调用wrapped_fibonacci未记录的原创,递归。

如果您还要替换wrapped_fibonacci,它会再次加速:

const fibonacci = wrapped_fibonacci = memoize(wrapped_fibonacci)