簡單的ifelse是大家應(yīng)用比較多的判斷方式闲坎,在情況更多樣的場景下,if else就顯得不夠簡潔了腰懂,但是也有很多人會認(rèn)為if else更能看清作者意圖,這種完全主觀的原因沒有什么討論的意義绣溜,那么我們就來討論一下,在有可枚舉的變量情況下做判斷怖喻,哪一種方式性能更好。
本次的判斷性能對比有三個參賽者:ifelse判斷锚沸,switch判斷,還有一個是同事推薦的使用對象進(jìn)行判斷的方案哗蜈,通過執(zhí)行對象的對應(yīng)方法來進(jìn)行判斷,比較方式也使用js自帶的的時間計算炼列。
我們使枚舉值有5個狀態(tài),對10000個數(shù)進(jìn)行判斷俭尖,只做判斷不做任何其他事,10000對5求余使枚舉值處于0-4之間稽犁,代碼如下
function iffunc(num){
if (num === 0){
} else if (num === 2){
}else if (num === 3){
} else if (num === 4) {
} else if (num === 1) {
}
}
function switchfunc(num) {
switch(num){
case 0:
break
case 1:
break
case 2:
break
case 3:
break
case 4:
break
}
}
function objectFunc(num) {
const obj = {}
obj[0] = function(){
}
obj[1] = function(){
}
obj[2] = function(){
}
obj[3] = function(){
}
obj[4] = function(){
}
obj[num]()
}
console.time('if')
for (let i = 0; i < 10000;i ++) {
const num = i % 5
iffunc(num)
}
console.timeEnd('if')
console.time('switch')
for (let i = 0; i < 10000 ;i ++) {
const num = i % 5
switchfunc(num)
}
console.timeEnd('switch')
console.time('obj')
for (let i = 0; i < 10000 ;i ++) {
const num = i % 5
objectFunc(num)
}
console.timeEnd('obj')
在相同情況下做10000次枚舉值判斷的時間消耗如下:
if: 2.133ms
switch: 0.685ms
obj: 10.553ms
結(jié)論:可以看到switch的性能最好菱农,ifelse消耗的時間是switch的三倍多一點(diǎn),而對象判斷方式則是ifelse判斷方式的5倍時間循未,對象判斷方式的主要時間消耗在于對象的創(chuàng)建秫舌,在把對象創(chuàng)建和方法添加放在方法外后,性能有了極大的改善
if: 1.893ms
switch: 0.620ms
obj: 0.763ms
可以看到這樣優(yōu)化以后足陨,對象判斷方式的執(zhí)行時間就與swicth非常接近了娇未,但是這個用來進(jìn)行判斷的對象僅僅在調(diào)用判斷方法時才會使用墨缘,沒有必要把它的作用于擴(kuò)大零抬,所以是不是應(yīng)該使用對象來進(jìn)行枚舉值判斷還要看具體的使用場景。
綜上平夜,個人認(rèn)為在涉及枚舉值判斷的情況下,都應(yīng)該用swicth來進(jìn)行判斷忽妒,而不是ifelse,而在對情況不可枚舉的情況下還是用ifelse更好一些段直,因?yàn)楦奖阕x者理解你的意圖,至于對象判斷方式鸯檬,由于和swich性能差距不大,就完全可以根據(jù)你的喜好來進(jìn)行使用