我该相信哪个?jsPerf or JSLitmus?

使用 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 测试页见这里
谢答。

阅读 2.6k
1 个回答

我认为这都支测试只能参考用而已,不是测试代码的问题,例如我的macOS+Chrome v55测你这代码后最快的是For -

不同的浏览器、版本、作业系统都有可能有不同的结果。有可能最快的是另一种,也有可能差异不同。

表面上语法上似乎看起来没缓存,但浏览器的JS引擎有自动(智能)缓存,而且有可能会去糖之后转为最有效执行,各种引擎实作不一,10多%算误差范围内,循环语法都可以视为同等效能,用途可能有些情况差异而已。

循环语句(for/while)与forEach/map相比就有比较大的的性能差异,这两种就是循环语句与调用函数的差异性。例如这个测试的结果。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏