算法和流程的控制
1、避免使用for -in循环遍历数组成员,
for in 循环每次迭代操作都会同时搜索实例或原型属性,会产生更多的开销,对比相同的迭代次数,for in 循环最终只有其他类型循环速度的1/7。
2、减少迭代的工作量
for(var i=0;i<items.length;i++){
process(items[i]);
}
(1)循环都要查找items.length,可以把它用局部变量缓存起来;
for(var i=0,len=items.length;i<len;i++){
process(items[i]);
}
循环只会在循环运行前对数组长度进行一次属性查找。根据数组长度,大多数浏览器能节省大概25%的运行时间。
(2)倒序加减少属性查找
for(var i=items.length;i--;){
process(items[i]);
}
通过倒序加属性减少查找,运行速度比原来版本提高50%~60%。
3.减少迭代次数
即使循环体中最快的代码,累计迭代上千次也会变得慢下来。此外,循环体本身运行也会带来小性能开销,不仅仅是增加了总体的运行时间。
减少迭代次数能获得更加显著的性能提升。
达夫设备模式
var iterators=Math.floor(items.length/8),
startAt =items.length%8,
i =0;
do{
switch(startAt){
case 0: process(items[i++]);
case 7: process(items[i++]);
case 6: process(items[i++]);
case 5: process(items[i++]);
case 4: process(items[i++]);
case 3: process(items[i++]);
case 2: process(items[i++]);
case 1: process(items[i++]);
}
startAt=0;
}while(--iterators);
每次循环最多可调用8次process,循环次数为总数除以8;
达夫设备优化
var i=0,//
len =items.length,//
nLeft =len%8;
while(nLeft--){
process(items[i++]);
}
nRounds= Math.floor(len / 8 );
while(nRounds--){
process(items[i++]);
process(items[i++]);
process(items[i++]);
process(items[i++]);
process(items[i++]);
process(items[i++]);
process(items[i++]);
process(items[i++]);
}
4、基于循环的迭代要优于基于函数(forEach)的迭代,快8倍。
5、调用栈限制,(IE7 1789,IE8 2232,chrome 21837 , Firefox 3000)。
6.浏览器的调用栈大小限制了递归算法,栈溢出错误会导致其他代码中断运行