web-dev-qa-db-fra.com

Case vs If Else If: Qu'est-ce qui est plus efficace?

Doublons possibles:
“else if” est-il plus rapide que “switch ()”?
Quelle est la performance relative de if/else vs switch en Java?

J'ai déjà codé en cours d'exécution .... lorsque le débogueur passe en revue une instruction case, il passe à l'élément qui correspond immédiatement aux conditions, mais lorsque la même logique est spécifiée à l'aide de if/else, il passe en revue toutes les instructions if. jusqu'à ce qu'il trouve le gagnant. L'instruction de cas est-elle plus efficace ou mon débogueur optimise-t-il le pas à pas? (ne vous inquiétez pas de la syntaxe/des erreurs, je l'ai tapé dans SO, je ne sais pas s'il compilera, c'est le principe que je cherche, je ne voulais pas les faire car ints parce que je me souviens vaguement de quelque chose à propos de J'utilise C #, mais je suis intéressé par une réponse générale à travers les langages de programmation.

switch(myObject.GetType()){

    case typeof(Car):
        //do something
        break;

    case typeof(Bike):
        //do something
        break;

    case typeof(Unicycle):
        //do something
        break;

    case default:
        break;
}

[~ # ~] vs [~ # ~]

   Type myType = myObject.GetType();

   if (myType == typeof(Car)){
            //do something
   }

   else if (myType == typeof(Bike)){
            //do something
   }

   else if (myType == typeof(Unicycle)){
            //do something
   }
   else{

   }
58
Aran Mulholland

Il semble que le compilateur optimise mieux une instruction switch que une instruction if.

Le compilateur ne sait pas si l'ordre d'évaluation des instructions if est important pour vous et ne peut y effectuer aucune optimisation. Vous pourriez appeler des méthodes dans les instructions-if, influençant les variables. Avec l'instruction-switch, il sait que toutes les clauses peuvent être évaluées en même temps et peuvent être placées dans l'ordre qui convient le mieux.

Voici une petite comparaison:
http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx

85
Zyphrax

Le débogueur simplifie les choses car vous ne voulez pas parcourir le code créé par le compilateur.

Si le commutateur contient plus de cinq éléments, il est implémenté à l'aide d'une table de recherche ou d'une table de hachage, sinon, il est implémenté à l'aide d'un if..else.

Voir la question étroitement liée “else if” est-il plus rapide que “switch ()”? .

D'autres langages que C # l'implémenteront bien sûr plus ou moins différemment, mais un commutateur est généralement plus efficace.

9
Guffa

De nombreux langages de programmation optimisent l’instruction switch de sorte qu’elle soit beaucoup plus rapide que la norme if-else si la structure est fournie à condition que les observations soient des constantes du compilateur. De nombreuses langues utilisent une table de saut ou indexée table de branche pour optimiser les instructions de commutateur. Wikipedia a une bonne discussion de la déclaration switch. En outre, ici est une discussion sur l’optimisation des commutateurs en C.

Une chose à noter est que les instructions de commutateur peuvent être abusées et, selon les cas, il peut être préférable d'utiliser le polymorphisme plutôt que les instructions de commutateur. Voir ici pour un exemple.

6
Ryan

Wikipédia L'entrée de l'instruction Switch est assez grande et en fait assez bonne. Points intéressants:

  • Les commutateurs ne sont pas intrinsèquement rapides. Cela dépend de la langue, du compilateur et de l'utilisation spécifique.
  • Un compilateur peut optimiser les commutateurs à l'aide de tables de saut ou de pointeurs de fonction indexés.
  • Cette déclaration s’inspire d’intéressantes mathématiques de Stephen Kleene (et d’autres).

Pour une optimisation étrange et intéressante en utilisant un commutateur C, voir Duff's Device .

0
Corbin March

je pense que c'est juste le débogueur qui le rend simple. Notez qu'un cas et "if list" ne sont finalement pas les mêmes. Il y a une raison pour laquelle les blocs de casse normalement se terminent par "break". Le cas d'espèce ressemble en fait à quelque chose comme ceci lorsqu'il est décomposé en Assemblée.

if myObject.GetType() == type of Car
    GOTO START_CAR
else if myObject.GetType() == type of Bike
    GOTO START_BIKE

LABEL START_CAR
//do something car     
GOTO END

LABEL START_BIKE
//do something bike  
GOTO END

LABEL END

Si vous n'avez pas la pause, les blocs "GOTO END" seront manquants, et en fait, si vous arrivez dans le cas "voiture", vous exécuterez les deux sections.

//do something car     
//do something bike  
GOTO END
0
mlathe

Je crois que parce que les cas doivent être des valeurs constantes, l’instruction switch équivaut à un goto; ainsi, en fonction de la valeur de la variable, elle saute au bon cas, alors que dans l’instruction if/then, elle doit évaluer chaque expression.

0
Nate Heinrich

cela peut être fait pour les instructions case car les valeurs sont des constantes du compilateur. Une explication plus détaillée est ici http://sequence-points.blogspot.com/2007/10/why-is-switch-statement-faster-than-if.html

0
mcintyre321