for in 比for loop慢至少20倍


发布者 ourjs  发布时间 1392519788000
关键字 编程技巧 
之前在:停止使用循环,教你用underscore优雅的写代码一文中,有评论提出for in的效率要比for loop(循环)的效率低非常多。现在我们测试一下在不同浏览器中使用for in, for loop和forEach在处理大数组时的效率究竟如何。

目前绝大部分开源软件都会在for loop中缓存数组长度,因为普通观点认为某些浏览器Array.length每次都会重新计算数组长度,因此通常用临时变量来事先存储数组长度,如:
for (var idx = 0, len = testArray.length; idx < len; idx++) {
  //do sth.
}
我们也会测试一下缓存与不缓存时的性能差异。

同时在每个测试循环中添加求和运算,来表明其不是空循环。

测试代码如下,点击运行即可查看

HTML 代码

<h4 id="browser"></h4>
<table id="results" class="table"></table>

JavaScript 代码



运行 [需稍等片刻]

测试结果

测试结果可能因计算而异,这是在我机器上运行用,Firefox, Chrome, IE三者测试结果拼接的一张汇总。

以下是几个观察到的结论

  • for in比for loop慢非常多,在Chrome中至少慢20倍
  • FF对forEach(ES5)做了优化,性能比for loop还要好一点,但Chrome/IEn性能均较差
  • FF/Chrome缓存Array.length均比直接用时要慢一点。除IE最新版缓存后性能提升微乎其微(这一点非常意外)
  • 在某些情况下,FF的JS引擎性能似乎比V8要好些




回复 (7)
  • #
  • #1 醉温柔 1392600056000
    浏览器会进步的……
  • #2 末尾曲 1392625753000
    难道不觉得开发完一个大型项目了之后,我不仅开发的更快,而且过了这几个月我俩的代码运行速度一样快了。。。
  • #3 蝶姐yrzhll 1392689165000
    for in 循环同样在查找对象属性时遍历原型链上的所有属性。包括原型自带的属性,所以最慢。
  • #4 风里麦笛 1392866302000
    [/可怜],但是for in 写上去最顺手啊。
  • #5 霓裳洛羽 1393083078000
    for in可以持久化所枚举变量,比较适合里面是异步的情况……
  • #6 WTF 1393391756000
    遍历 Array 的时候选择 for loop , 遍历 Object 的时候选择 for in 已经是常识了吧? 而且 for in 的时候还得保证 obj.hasOwnProperty() 这也是基本语法了. 建议大家写代码的时候开启 jsHint.可以跳过很多坑.
  • #7 云瓜令 1436856161705

    缓存应该用局部变量,也就是应该用 在 for 里面用 var 定义一下,才会快。

微信扫码 立即评论