提高javascript性能之 条件语句

  本内容来自:《高性能javascript》一书,感觉写的很好摘录下来分享给大家

           条件表达式决定了JavaScript程序的流向。其他语言对应该使用if-else语句还是switch语句的传统观点同样适用于JavaScript。由于不同的浏览器针对流程的控制进行了

   不同的优化。因此使用哪种技术更好没有定论。

        1、if-else对比switch

               使用if-else还是switch,最流行的方法是基于测试条件的数量来判断:条件数量越大,越倾向于switch而不是if-else。这通常归结于代码的易读性。这个观点认为,当

      循环条件较少时if-else更易读,当条件数量较多时switch更易读。考虑如下代码:

             

if(found){
  //代码处理
}else(){
  //其他代码处理
}

switch(found){
   case true:
      //代码处理
	  break;
   default:
     //其他代码处理
}
      尽管两块代码完成的是相同的任务,但还是有很多人认为if-else语句比switch更容易度。然而,如果增加条件语句的数量,这种观点会被扭转过来:

            

if(color == 'red'){
    //代码处理
}else if(color == 'blue'){
   //代码处理
}else if(color == 'brown'){
   //代码处理
}else if(color == 'black'){
   //代码处理
}else {
  //代码处理
}

switch(color){
   case 'red':
      //代码处理
	  break;
   case 'blue':
      //代码处理
	  break;
   case 'brown':
      //代码处理
	  break;
   case 'black':
      //代码处理
	  break;
   default :
     //代码处理
}
          大多数人会认为对于这段代码,switch表达式比if-else表达式可读性更好。

          事实证明,大多数情况下switch比if-else运行的要快,但只有当条件数量很大时才能快得明显。这个两个语句主要性能区别是:当条件增加时,if-else性能负担增加的程度比switch要多。

  因此,我们自然倾向于在数量较少是使用if-else,而在条件数量较大时使用switch。这从性能方面考虑也是合理的。

         通常来说,if-else适用于判断两个离散值或几个不同的值域。当判断多有两个离散值时,switch语句是更佳选择。

      2、优化 if-else       

                 优化if-else的目标是:最小化到达正确分支前所需判断的条件数量。最简单的优化方法是确保最可能出现的条件放到首位。考虑如下代码:

                       

if(value < 5){
  //代码处理
}else if(value > 5 && value < 10){
   //代码处理
}else{
   //代码处理
}
               该段代码只有当value值经常小于5时才是最优的。如果value大于5或者等于10,那么每次到达正确分支之前必须经过两个判断条件。最终增加了这个语句的所消耗的平均时间。if-else中的条件

     语句总应该是按照从最大概率到最小概率的顺序排列,以确保运行速度最快。

             另一种减少条件判断次数的方法是把if-else组织成一系列嵌套的if-else语句。使用单个庞大的if-else通常会导致运行缓慢,因为每个条件都学要判断。例如:

              

if(value == 0){
   return result0;
}else if(value == 1){
   return result1;
}else if(value == 2){
   return result2;
}else if(value == 3){
   return result3;
}else if(value == 4){
   return result4;
}else if(value == 5){
   return result5;
}else if(value == 6){
   return result6;
}else if(value == 7){
   return result7;
}else if(value == 8){
   return result8;
}else if(value == 9){
   return result9;
}else if(value == 10){
   return result10;
}
         在这个if-else表达式中,条件语句最多判断10次。假设value的值在1到10之间均匀分布。那么这会增加平均运行时间。为了最小化条件判断次数,代码可重写为一系列嵌套的if-else语句,比如:

             

if(value < 6){
   if(value < 3){
      if(value == 0){
	    return result0;
	  }else if(value == 1){
	     return result1;
	  }else{
	     return result2;
	  }
   }else{
     if(value == 3){
	    return result3;
	 }else if(value == 4){
	    return result4;
	 }else {
	    return result5;
	 }
   }
}else{
   if(value < 8){
      if(value == 6){
	     return result6;
	  }else{
	    return reuslt7;
	  }
   }else{
      if(value == 8){
	     return result8;
	  }else if(value == 9){
	    return result9;
	  }else{
	    return result10;
	  }
   }
}
       重写后的if-else语句每次到达正确分支最多经过4次条件判断。它使用二分法把值域分成一系列的区间,然后逐步缩小范围。当值的范围均匀分布在0到10之间时,代码运行的平均时间大约是前面例子的一半。

这个方法非常适用于有多个值域需要测试的时候(如果是 离散值,那么switch语句通常更为合适)。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值