提高javascript性能之 条件语句

来源:互联网 发布:js 代码整理 编辑:程序博客网 时间:2024/06/05 09:31

  本内容来自:《高性能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语句通常更为合适)。




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 银行卡丢了记不住卡号怎么办 哈尔滨医保卡挂失后又找到了怎么办 孩子在哈尔滨户口在外地医保怎么办 椒江二桥通行证被扣走了怎么办 住建委查到买房材料不真怎么办 房子租出去被别人又租出去了怎么办 在成都乘出租车房产证掉了怎么办 电信不限量卡限网速了怎么办 only实体店换货没有小票怎么办 运管所包车单不给盖章怎么办 上海留学生落户过了取号时间怎么办 电信固话怎么办才能显示自己公司 日本跟团签证没有资产证明怎么办 摇号手机号换了密码忘了怎么办 小客车摇号的账号密码忘了怎么办 去银行交违章罚款单子丢了怎么办 我的身份证被别人办了信用卡怎么办 北京驾驶证在深圳扣了分怎么办 c照一次被扣12分怎么办 教师资格证认定申请表填错了怎么办 外地车在北京违章没有牡丹卡怎么办 护士辞职了原单位不给延续怎么办 护士证注册的单位倒闭了怎么办 护士证注册的医院倒闭了怎么办 显示发货了但没物流信息怎么办 考科目三被别人举报了怎么办 科目一考了5没过怎么办 常州c1驾驶证满了12分怎么办 预约科目三成功后没交钱怎么办 预约成功后驾校不提交档案怎么办 c2刚满一年的驾照扣12分怎么办 怀孕6个月咳嗽很厉害怎么办 家门口有电线杆影响我建楼房怎么办 卡丢了不知道卡号怎么办 驾考网上预约用户被锁定了怎么办 人才中心拿出来的户口掉了怎么办 父母是南京集体户孩子没户口怎么办 二建挂靠中介单位不给证怎么办 小包工头遇到工人在工地摔伤怎么办 外地人买了城中村的房子改造怎么办 深圳社保怀孕了产检异地怎么办