这两个for循环在性能上有何不同?为什么?什么是最好的迭代方法
var letters=
['a','b','c','d','e','f','','','',''];
var start=new Date()
for(var i=0,abc=letters.length;i<abc;i++){
alert(letters[i]);
}
var end=new Date()
alert(end-start)
var letters1=['a','b','c','d','e','f','','','',''];
var start1=new Date()
for(var i=0;i<letters1.length;i++){
alert(letters1[i]);
}
var end1=new Date()
alert(end1-start1);
最佳答案
在旧的浏览器中,在遍历数组之类的对象时缓存循环的限制几乎总是比每次获得限制(例如array.length)都要快得多。在现代浏览器中,没有那么多。
通常,只有在被迭代的对象是脚本引擎知道在迭代过程中可能会改变但不会改变的类型时,缓存才具有明显的性能优势。
例如,如果遍历live NodeList:
var nodeList = document.getElementsByTagName('*');
for (var i=0, iLen=nodeList.length; i<iLen; i++) {
// do stuff
}
在浏览器中可测量(如果没有明显)的速度比:
for (var i=0; i<nodeList.length; i++) {
// do stuff
}
但是,正如其他人指出的那样,循环中完成的工作可能要重要得多,因此在测试中节省几个周期是没有用的。但是对于某些人来说,他们的标准循环模式包括如果未在循环中修改极限,则将其缓存并始终执行。
顺便说一句,用于测量浏览器中的时间的是High Resolution Time specification(另请参见MDN Peformance.now)。