Loop Benchmarks
循环语句有各种写法,哪种效率最高呢?
测试页面:loop-test.html
结论:
- 效率很差的几个方式:arr.forEach 遍历(原生也慢),for in 遍历, arr.pop() 判断,arr[i] 判断。这些写法或许很酷很精简,但对性能有要求时,最好避免使用。
- 多测试几十次,看统计平均结果,在 Firefox 下:++i < i++ < i = i + 1 < i += 1. 原因可以回溯到汇编语言。当然,这更多是编码习惯问题,对性能的影响可以忽略不计。推荐采用最常用的 i++ 或 ++i.
- 缓存 length 能很明显地提高性能,推荐将其养成编码习惯。
参考页面:Loop Benchmarks, 对普通数组、稀疏数组和 HTML 集合都进行了测试。

September 18th, 2009 on 15:38
在ie第二个16ms第三个0ms
奇怪i++跟++i效率还是有差别
September 18th, 2009 on 16:41
没想到for这么慢
没想到i++比++i有看得见的差别
September 18th, 2009 on 17:20
to cc:
多刷新几次,i++和++i差别没那么大,我用的IE7,大部分时候都是16ms。
September 18th, 2009 on 21:50
“缓存 length”?:for( var i=0, len=arr.length ; i<len ; i++){}
September 19th, 2009 on 0:58
学习了,以下三个是最快的。
for (var i=arr.length; i–;) { }
var i = arr.length-1; do { } while (i–);
var i = arr.length; while (i–) { }
September 19th, 2009 on 18:16
Webkit 感觉明显比其它核心快……
September 22nd, 2009 on 17:09
记得有人测试过i+=1较之i++有着微弱的性能优势,不过写着很是不爽,还多一个字符。
September 23rd, 2009 on 12:34
正好时间在整理总结关于Javascript性能优化的文章,关于循环方面缺乏足够的测试,雕兄这篇文章真是完美。
http://www.fangyuqiang.com/archives/417
September 23rd, 2009 on 16:15
做前端辛苦吗?
September 26th, 2009 on 13:50
1. ++i < i++ < i = i + 1 < i += 1. 原因可以回溯到汇编语言。 这个不太明白,回溯到汇编的话,我会看的也就两个方面:一是看指令,编译器没有道理把i += 1整成INC而把++i整成ADD;二是看内存操作还是寄存器操作(当然最终计算都要进寄存器的,内存不过是多了来回倒腾),我也看不出为i += 1的i分配成寄存而把++i的i放内存里的理由。还望赐教。
2. 现实的问题是,我们通常说的javascript,多在操作DOM。一次多余的或不当的DOM操作,就足以抵消对javascript语言细节上的十次优化。网上说到javascript,总是跟DOM联系在一起的(有很多人甚至以为alert是javascript的内置函数),但是说到前端脚本的优化,却从来只谈javascript的奇技淫巧——当然到了最后,拼的就是细节,但我以为目前国内前端开发的整体水平以及需求,都还远远不到那个层次,掌握话语权的同志们动辄循环和汇编,往往不经意将广大民众引入歧途。
3. 回到程序设计本身,算法才是王道,真正不可接受的耗时是重复计算。比如朴素的菲波拉契数递归算法:function fib(n){return n < 2 ? 1 : fib(n – 1) + fib(n – 2)},即使换作C语言,fib(100)也得算上若干年。
September 26th, 2009 on 14:41
@ls:
1. 可以参考 http://bbs.51js.com/viewthread.php?tid=84235
2. 同意
3. 非常同意
推荐一本书《Even.Faster.Websites》,这些才是优化的主要方向。
September 26th, 2009 on 21:50
哈哈看反了
++i < i++ < i = i + 1 < i += 1
以为小于号是指效率,我说怎么就想不通呢
September 29th, 2009 on 12:26
jQuery中
inArray: function( elem, array ) {
for ( var i = 0, length = array.length; i < length; i++ )
// Use === because on IE, window == document
if ( array[ i ] === elem )
return i;
return -1;
},
September 30th, 2009 on 0:59
擂主辛苦。“原因可以回溯到汇编语言”这句过了。10楼靠谱。
September 30th, 2009 on 10:13
不知道 啥原因,我的opera 10.0居然那么慢,通常都是200多ms,其他浏览器正常
leave a reply