本內容來自:《高性能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語句通常更爲合適)。