记事不按预期工作?
我目前正在学习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-original
被fibonacci-the-memoized
。
在非工作示例中,您正在从wrapped_fibonacci
创build一个memoized函数fibonacci
,但是该函数仍会recursion地调用wrapped_fibonacci
(未logging的原始对象)。
如果你还要replacewrapped_fibonacci
,它会再次加速:
const fibonacci = wrapped_fibonacci = memoize(wrapped_fibonacci)
- 为什么'this'在箭头函数中被引用时返回'undefined',但是在匿名函数中被调用时不会被返回?
- 在Express.js应用程序中服务客户端JavaScript
- 将文件从一个文件夹复制到同一个桶的s3中的另一个文件夹NODE JS
- 如何在Node.js中为非常大(> 1GB)的文件的每一行运行一个asynchronous函数
- findByIdAndUpdate $设置不检查唯一?
- 如何在你的Ionic / AngularJs应用程序中包含和使用节点模块?
- 如何存根Mongoose模型的构造函数
- Mongoose如何添加一个方法来模拟每次更新或创build文档时执行的模式?
- Bot将string返回给我没有指定的数字