为什么在使用全局变量而不是本地变量进行记忆时,递归速度更快?

时间:2013-04-04 19:07:57

标签: javascript performance recursion memoization

我在尝试加速递归函数时发现了一些特殊的东西。当我创建用于memoization的对象时,将一个参数传递给函数而不是全局变量,代码执行变得相当慢。

所以不要这样:

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

var a = factorial(10);

我将代码更改为:

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

代码执行成为>慢了50倍。

jsperf

为什么会发生这种情况?以下是包含完整代码的jsperf

1 个答案:

答案 0 :(得分:2)

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

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

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