2

在尝试加速递归函数时,我注意到了一些奇怪的事情。当我将用于记忆的对象作为要传递给函数的参数而不是全局变量时,代码执行变得相当慢。

所以代替这个:

var memoizationObj = {};
function factorial(n) {
  // factorial code
};

var a = factorial(10);

我将代码更改为:

function factorial(n, memoizationObj) {
  // factorial code
};
var b = factorial(10, {});

代码执行速度变慢了 50 倍以上。

jsperf

为什么会这样?这是带有完整代码的jsperf 。

4

1 回答 1

2

原因是所有试验只调用一次 setUp,因此对于全球版本的第一次试验之后的每次试验,您都是从完整的备忘录开始的。基本上,您只计算一次该值,所有后续运行只返回一个缓存结果。

请参阅此版本以获得更好的比较,它会在每次运行全局测试时重置全局备忘录。

http://jsperf.com/recursion-with-global-obj-vs-arg/2

于 2013-04-04T19:29:46.480 回答