提高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語句通常更爲合適)。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章