【发布时间】:2014-06-16 00:40:59
【问题描述】:
最初我正在测试添加一些缓存结果的代码将如何影响初始计算时间。我创建了一个计算阶乘的简单递归函数:
function fac(n){
return n <= 1 ? 1 : fac(n-1) * n;
}
然后我添加缓存结果供以后使用的部分:
var f = [];
function fac(n){
return n <= 1 ? 1 : f[n] ? f[n] : f[n] = fac(n-1) * n;
}
I put them in jsPerf 结果是带缓存的版本出乎意料地快。我怀疑这可能是因为我使用的数组f 在测试运行器中保持不变。该函数只是从数组中获取值,因此速度更快。
为了测试,我创建了另一个只返回数组值的函数:
var test = []; test[10] = 3628800;
function control(n){
return n <= 1 ? 1 : test[n] ? test[n] : 1;
}
结果表明该控件比添加了缓存的函数快得多。因此得出以下结论:
数组
f保持不变,ops/sec 的差异是由初始计算引起的。数组
f每次都被“重置”,并且由于某种原因它比普通版本更快。
我不相信初始计算会使整个测试比对照慢 74%,因此 #2 应该是正确的。但是是什么让它比普通版本更快呢?从 15,262,318 ops/sec 到 114,370,808 ops/sec 实际上非常重要。
【问题讨论】:
-
为什么你认为缓存的版本会变慢?你想测试什么样的调用?
-
@Bergi - 我希望缓存版本会更慢,因为它必须将更多数据写入内存。
-
但仅适用于第一次调用!当运行大约一百万次时(jsperf 告诉你每个测试循环的时间很长),这完全无关紧要。现在比较一个数组访问与 10 个函数调用。
-
另外,您能否将其他测试用例与无意义的
control函数联系起来? -
@Bergi - “无意义”是什么意思?
标签: javascript performance memoization