我在尝试加速递归函数时发现了一些特殊的东西。当我创建用于memoization的对象时,将一个参数传递给函数而不是全局变量,代码执行变得相当慢。
所以不要这样:
var memoizationObj = {};
function factorial(n) {
// factorial code
};
var a = factorial(10);
我将代码更改为:
function factorial(n, memoizationObj) {
// factorial code
};
var b = factorial(10, {});
代码执行成为>慢了50倍。
为什么会发生这种情况?以下是包含完整代码的jsperf。
答案 0 :(得分:2)
原因是setUp仅针对所有试验调用一次,因此对于全球版本的第一次试验之后的每个试验,您将从完整的备忘录开始。基本上,您只计算一次值,所有后续运行只返回缓存结果。
为了更好的比较,请参阅此版本,它会在每次运行Global测试时重置全局备忘录。