兩者的對比
使用if else 還是 switch 目前一般是從代碼可讀性的角度出發,基於判斷條件的數量來決定:數量越多就越傾向於 switch 而不是 if else。
事實證明除了代碼可讀性,switch 的運行速度是比 if else 更快的。
相比較於 if else ,switch 的實現采取了branch table 索引來進行優化(深入了解可以看這里:https://en.wikipedia.org/wiki/Switch_statement) ,而且 switch 語句比較時使用是全等操作符,不會發生類型轉換的損耗。
環境:Mac、火狐71
9999999次 chrome看不出明顯變化
if-else 例子
var start = new Date().getTime();
var a = 6;
for(let i = 0; i < 9999999; i++) {
switch(a) {
case 1: ;break;
case 2: ;break;
case 3: ;break;
case 4: ;break;
case 5: ;break;
default : ;
}
}
var end = new Date().getTime()
console.log(end - start);
// 運行時間在 1100 毫秒左右波動
switch 例子
var start = new Date().getTime();
var a = 6;
for(let i = 0; i < 9999999; i++) {
if (a == 1) {
} else if (a == 2) {
} else if (a == 3) {
} else if (a == 4) {
} else if (a == 5) {
} else {
}
}
var end = new Date().getTime()
console.log(end - start)
// 運行時間在 5200 毫秒左右波動
優化 if-else
1、確保最可能出現的條件放在首位
以上面為例,我的變量 a 最可能等於 1 那么,執行時間就會大大降低
var a = 1; // 把這個改為 1
for(let i = 0; i < 9999999; i++) {
if (a == 1) { // 走到這里就滿足了條件
} else if (a == 2) {
} else if (a == 3) {
} else if (a == 4) {
} else if (a == 5) {
} else {
}
}
// 現在它的執行時間和 switch 執行時間無限接近了,在1100左右
如果 a = 2 ,那么執行時間在2200毫秒左右波動
因此,在 if-else 語句中,它的條件語句應該以 **最大概率出現到最小概率出現依次排列。**
2、減少判斷的次數,使用嵌套語句
假設 a 的值出現的概率都差不多,那么可以減少外層的 if-else,而是把它拆開,分成幾塊來判斷。
把最開始那個if-else的例子稍微改一下
var start = new Date().getTime();
var a = 6;
for(let i = 0; i < 9999999; i++) {
if (a <= 3) {
if (a == 1) {
} else if (a == 2) {
} else {
}
} else {
if (a == 4) {
} else if (a == 5) {
} else {
}
}
}
var end = new Date().getTime()
console.log(end - start)
// 現在它的執行時間在 3200 毫秒左右波動
## 查找表
在項目中,有時候優化條件語句的最好辦法還是避免使用 if-else 和 switch 語句,而是通過數組和對象來查詢,也就是查找表(lookup Tables)。
直接看例子
// 通過條件判斷
function getColor(c) {
if(c == 'blue'){
return 'blue的rgba值'
}else if(c === 'block'){
return 'block的rgba值'
}else if(c === 'yellow'){
return 'yellow的rgba值'
}else(c === 'green'){
return 'green的rgba值'
}
}
// 通過 map 映射
function getColor(c) {
return {
'blue': 'blue的rgba值',
'block': 'block的rgba值',
'yellow': 'yellow的rgba值',
'green': 'green的rgba值',
}[c]
}
整個過程只是對象成員 或者 數組項的查詢,沒有條件語句,因此也不會有那些性能上的問題。
結論
一:switch 性能高於 if-else
二:項目中盡量避免使用 switch 和 if else,使用查找表代替
