Cas vs If If Si: Quel est le plus efficace?

Dupliqués possibles:
Est-ce que «else if» est plus rapide que «switch () case»?
Quelle est la performance relative de if / else par rapport au switch en Java?

J’ai recommencé à coder pendant l’exécution du débogueur à travers une instruction de cas, il passe directement à l’élément qui correspond aux conditions, mais lorsque la même logique est spécifiée avec if / else, il parcourt chaque instruction if jusqu’à ce qu’il trouve le gagnant. La déclaration de cas est-elle plus efficace ou mon débogueur optimise-t-il simplement le passage? (ne vous inquiétez pas de la syntaxe / des erreurs, j’ai tapé ceci dans SO, je ne sais pas si cela va comstackr, c’est le principe que je recherche, je ne voulais pas les faire car cas utilisant un offset avec ints) J’utilise C #, mais je suis intéressé par une réponse générale dans 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; } 

CONTRE

  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 est mieux en optimisant une instruction switch qu’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 pouvez appeler des méthodes dans les instructions if, en influençant les variables. Avec le switch-statement, il sait que toutes les clauses peuvent être évaluées en même temps et peuvent être placées dans l’ordre le plus efficace.

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

    Le débogueur simplifie la tâche, car vous ne souhaitez pas parcourir le code créé par le compilateur.

    Si le commutateur contient plus de cinq éléments, il est implémenté en utilisant une table de consultation ou une table de hachage, sinon il est implémenté en utilisant un if..else.

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

    Bien entendu, d’autres langages que C # l’implémenteront plus ou moins différemment, mais un changement est généralement plus efficace.

    De nombreux langages de programmation optimisent l’instruction switch afin qu’elle soit beaucoup plus rapide qu’une structure if-else standard, à condition que les cas soient des constantes du compilateur. De nombreux langages utilisent un tableau de sauts ou un tableau de twigs indexées pour optimiser les instructions de commutation. Wikipedia a une bonne discussion sur la déclaration de changement. En outre, voici une discussion sur l’optimisation des commutateurs dans C.

    Une chose à noter est que les instructions de commutation peuvent être utilisées à mauvais escient et, selon le cas, il peut être préférable d’utiliser un polymorphism plutôt que des instructions de commutation. Voir ici pour un exemple.

    Je pense que parce que les cas doivent être des valeurs constantes, l’instruction switch fait l’équivalent d’un goto, donc 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.

    il peut le faire pour les instructions de cas 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

    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 cas se terminent normalement par “break”. Le cas stmt ressemble en fait à quelque chose comme cela lors de l’assemblage.

     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 ne faites pas la pause, alors les cases “GOTO END” seront manquantes, et si vous aviez atterri dans la case “voiture”, vous courriez dans les deux sections.

     //do something car //do something bike GOTO END 

    L’ entrée de l’instruction Switch de Wikipedia est assez grande et en fait très bonne. Points intéressants:

    • Les commutateurs ne sont pas insortingnsèquement rapides. Cela dépend de la langue, du compilateur et de l’utilisation spécifique.
    • Un compilateur peut optimiser les commutateurs en utilisant des tables de sauts ou des pointeurs de fonction indexés.
    • La déclaration a été inspirée par des mathématiques intéressantes de Stephen Kleene (et d’autres).

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