使用 jsPerf 和 JSLitmus 对各种各样的循环做了 N 次测试。
定义数组a=["It's","a","loop"]
起初,两个测试器都给出了 For +
for (var i=0;i<a.length;i++){
a[i]
}
效率最高(五次均是)
???
为什么?
在多次测试后,jsPerf 告诉我
“其实是 For + cache(六次平均)
for (var i=0,len=a.length;i<len;i++){
a[i]
}
JSLitmus 纠正道:
“不!是 Do While + cache(三次平均)
var i=0,len=a.length
do {
a[i]
i++
}
while(i<len)
不解。前后性能为什么会不一样?为何最初不缓存变量直接i<a.length
性能更高?
还是测试代码有问题?到底那种循环性能更好?
jsPerf 测试页见这里
谢答。
我认为这都支测试只能参考用而已,不是测试代码的问题,例如我的macOS+Chrome v55测你这代码后最快的是
For -
。不同的浏览器、版本、作业系统都有可能有不同的结果。有可能最快的是另一种,也有可能差异不同。
表面上语法上似乎看起来没缓存,但浏览器的JS引擎有自动(智能)缓存,而且有可能会去糖之后转为最有效执行,各种引擎实作不一,10多%算误差范围内,循环语法都可以视为同等效能,用途可能有些情况差异而已。
循环语句(for/while)与forEach/map相比就有比较大的的性能差异,这两种就是循环语句与调用函数的差异性。例如这个测试的结果。