所以,我有许多案例的Switch语句,例如
switch(var){ case 1: myfunc(); break; ... case 40: myanotherfunc(); break; }
将几个子开关中的这些情况分开是提高性能的好方法吗? E.g。
switch(var){ case 1: switch(var2){ case 1: myfunc(); break; case 2: myfuncfoo(); break; }; break; ... case 5: switch(var2){ case 1: myfunct(); break; case 2: myfuncfoobar(); break; }; break;
我想在这种情况下,js不会检查所有情况,它会先检查几个案例,然后再检查几个案例等。
答案 0 :(得分:0)
我不了解性能 - 这是一个从JavaScript引擎更改为JavaScript引擎的功能,但可读性方面,它很可怕。
由于JavaScript在对象中具有如此出色的键/值支持,并且对象访问被优化为非常快,我发现自己根本不再使用switch语句。
var myDoGizmo = {
"1": {
"1": func1_1,
"2": func1_2
},
"2": {
"1": func2_1,
"2": func2_2
}
};
// Maybe a guard here if there can possibly be an out-of-range value.
myDoGizmo[1][1]();
答案 1 :(得分:0)
好奇我决定做一个非常快速的测试。 如果案例是随机的话,似乎性能差异很小......(奇怪的是,在IE上,双开关似乎与chrome相比表现更差。)Smallswitch确实有额外的math.floor并且当然是分开的。
当开关变得更大时,可能会出现明显的差异,但我会说平均而言,它仍然倾向于运气(哪些情况被击中,前一个或后一个)更快。
function bigSwitch(value){
switch(value){
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;
case 9:
break;
case 10:
break;
case 11:
break;
case 12:
break;
case 13:
break;
case 14:
break;
case 15:
break;
case 16:
break;
case 17:
break;
case 18:
break;
case 19:
break;
case 20:
break;
}
}
function smallSwitch(value){
switch(Math.floor(value/5)+1){
case 1:
switch(value%5){
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
}
break;
case 2:
switch(value%5){
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
}
break;
case 3:
switch(value%5){
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
}
break;
case 4:
switch(value%5){
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
}
break;
}
}
var runsToDo = 10000000;
var timer = Date.now();
for(var i=0; i<runsToDo; i++){
var value = Math.floor(Math.random()*20) + 1;
bigSwitch(value);
}
console.log("BigSwitch time = ", Date.now() - timer);
timer = Date.now();
for(var i=0; i<runsToDo; i++){
var value = Math.floor(Math.random()*20) + 1;
smallSwitch(value);
}
console.log("smallSwitch time = ", Date.now() - timer);