记事不按预期工作?

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

这不能正常工作,并不正确caching。

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上做这些testing

第一个结果就是这样。

 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的差异

任何人都可以阐明这一点?

在工作示例中,您正在使用称为fibonacci的memoized函数replacefibonacci 。 recursion调用使用这个memoized函数,因为fibonacci-the-originalfibonacci-the-memoized

在非工作示例中,您正在从wrapped_fibonacci创build一个memoized函数fibonacci ,但是该函数仍会recursion地调用wrapped_fibonacci (未logging的原始对象)。

如果你还要replacewrapped_fibonacci ,它会再次加速:

 const fibonacci = wrapped_fibonacci = memoize(wrapped_fibonacci)