是什么让代码更快?
What Makes the Code Faster
最初我是在测试添加一些缓存结果的代码将如何影响初始计算时间。我创建了一个简单的递归函数来计算阶乘:
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;
}
我把它们放在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次/秒到114,370,808次/秒,这是非常显著的
我怀疑control
优化得这么好是因为它没有工作。快速查看一下就会发现它只有2个可能的返回值:test[10]
或1
。由于您从未在函数中向test
添加任何内容,因此它可能被优化到几乎为零。
要小心性能测试,通常在一个主机上更快的东西在另一个主机上更慢。
如果你真的关心速度,不要使用递归,因为顺序循环在所有主机中几乎总是明显更快。阶乘函数通常用于递归示例,因为它与非递归函数相比更容易理解和比较,而不是因为它更快。
使用带有存储结果的循环函数应该是所有函数中最快的:
var factorial = (function () {
var facStore = [1,1,2];
return function (n) {
var x = n;
var result = 1;
if (n == 0 || facStore[n]) return facStore[n];
while (n) result = result * n--;
facStore[x] = result;
return result;
}
}());
这是更多的类型,但性能优势是显著的。
相关文章:
- 这个代码是什么意思(history.replaceState和history.pushstate)
- “$”的键代码是什么
- JQuery:这段代码是什么意思
- 在我的javascript文件中发现的这个奇怪的代码是什么
- “[原生代码]”是什么意思
- 单击另一个用于显示/隐藏图层的按钮时,在Adobe PDF中隐藏/显示按钮的代码是什么
- 点的关键代码是什么
- 在单独的.js文件中使用谷歌分析的代码是什么
- Array.prototype.some() 是否返回文字?如果是这样,这段代码是什么意思
- Javascript这行代码是什么意思
- javascript代码是什么!=-我愿意
- JS代码$$是什么意思
- Django民意测验教程第3部分:Polls/templates/Polls/index.html-这段代码是什么?它&
- 扩展阅读更多的jQuery代码是什么
- 可以'我搞不清楚这个JS代码是什么意思
- 在angularjs中鼠标离开和鼠标取出的代码是什么?没有jquery
- 这段代码是什么意思?(窗口),函数(a, b, c)
- 混淆代码是什么意思?
- 验证表单的JavaScript代码是什么?通过循环按名称获取元素
- 代码是什么?长度== + Length "JavaScript中的mean