《高性能Javascript》 学习笔记 web性能优化(二)

算法和流程的控制

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.浏览器的调用栈大小限制了递归算法,栈溢出错误会导致其他代码中断运行














  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值