多个Switch-Case语句

时间:2014-08-12 08:31:14

标签: javascript performance switch-statement case

所以,我有许多案例的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不会检查所有情况,它会先检查几个案例,然后再检查几个案例等。

2 个答案:

答案 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);

请参阅:http://jsfiddle.net/m67uhuxy/