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{
}
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
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.
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.
Wikipédia L'entrée de l'instruction Switch est assez grande et en fait assez bonne. Points intéressants:
Pour une optimisation étrange et intéressante en utilisant un commutateur C, voir Duff's Device .
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
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.
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