Est-ce que «else if» est plus rapide que «switch () case»?

Duplication possible:
Y a-t-il une différence significative entre l’utilisation de if / else et la commutation dans C #?

Je suis un ex-Pascal, qui apprend actuellement le C #. Ma question est la suivante:

Le code ci-dessous est-il plus rapide que de faire un changement?

int a = 5; if (a == 1) { .... } else if(a == 2) { .... } else if(a == 3) { .... } else if(a == 4) { .... } else .... 

Et le commutateur:

 int a = 5; switch(a) { case 1: ... break; case 2: ... break; case 3: ... break; case 4: ... break; default: ... break; } 

Lequel est le plus rapide?

Je demande, parce que mon programme a une structure similaire (beaucoup, beaucoup “else if” déclarations). Dois-je les transformer en commutateurs?

Pour quelques articles seulement, la différence est faible. Si vous avez beaucoup d’articles, vous devez absolument utiliser un commutateur.

Si un commutateur contient plus de cinq éléments, il est implémenté à l’aide d’une table de consultation ou d’une liste de hachage. Cela signifie que tous les éléments obtiennent le même temps d’access, comparé à une liste de si: s où le dernier élément prend beaucoup plus de temps à atteindre car il doit d’abord évaluer chaque condition précédente.

Pourquoi est-ce que tu t’en préoccupes?

99,99% du temps, vous ne devriez pas vous en soucier.

Ces types de micro-optimisations sont peu susceptibles d’affecter les performances de votre code.

De plus, si vous devez faire attention, vous devriez faire un profilage des performances sur votre code. Dans ce cas, trouver la différence de performance entre un commutateur et un bloc if-else serait sortingvial.

Edit: Par souci de clarté: implémentez la conception la plus claire et la plus facile à entretenir. Généralement, face à un énorme changement de casse ou à un autre, la solution consiste à utiliser le polymorphism. Trouvez le comportement qui change et encapsulez-le. J’ai dû faire face à un code de casse comme celui-ci et ce n’est généralement pas si difficile à simplifier. Mais oh tellement satisfaisant.

Croyant à cette évaluation de performance , le boîtier de commutation est plus rapide.

Ceci est la conclusion:

Les résultats montrent que l’instruction switch est plus rapide à exécuter que l’échelle if-else-if. Cela est dû à la capacité du compilateur à optimiser l’instruction switch. Dans le cas du ladder if-else-if, le code doit traiter chaque instruction if dans l’ordre déterminé par le programmeur. Cependant, comme chaque cas dans une instruction switch ne repose pas sur des cas antérieurs, le compilateur est en mesure de réorganiser les tests de manière à fournir l’exécution la plus rapide.

Une autre chose à considérer: est-ce vraiment le goulot d’étranglement de votre application? Il y a des cas extrêmement rares où une optimisation de ce type est vraiment nécessaire. La plupart du temps, vous pouvez obtenir de meilleurs résultats en repensant vos algorithmes et structures de données.

Je dirais que le changement est la voie à suivre, il est à la fois plus rapide et plus pratique.

Il existe différents liens tels que ( http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx ) qui montrent des tests comparant les deux.

Ne devrait pas être difficile à tester, créez une fonction qui change ou si elle est entre 5 numéros, lancez un rand (1,5) dans cette fonction et bouclez-le quelques fois en le chronométrant.

Le commutateur est généralement plus rapide qu’une longue liste de ifs car le compilateur peut générer une table de saut. Plus la liste est longue, meilleure est la déclaration de changement sur une série d’instructions if.

Les problèmes de lisibilité sont beaucoup plus importants que les avantages en termes de performances des commutateurs (qui sont relativement faibles, mais dignes de mention).

Pour ma part, je trouve une déclaration de changement extrêmement claire dans l’intention et dans les espaces blancs, par rapport aux chaînes de ifs.

Je ne suis pas sûr, mais je pense que la vitesse de l’un ou de l’autre change en fonction du langage de programmation que vous utilisez.

Je préfère généralement utiliser le commutateur. De cette façon, le code est simple à lire.

Techniquement, ils produisent exactement le même résultat, ils devraient donc être optimisables à peu près de la même manière. Cependant, il y a plus de chances que le compilateur optimise le cas du commutateur avec un tableau de saut que le ifs.

Je parle du cas général ici. Pour 5 entrées, le nombre moyen de tests effectués pour les ifs doit être inférieur à 2,5, en supposant que vous commandez les conditions par fréquence. À peine un goulot d’étranglement à propos de la maison à moins que dans une boucle très serrée.

Si possible, le compilateur switch généralement le switch en une table de consultation. Donc, la recherche d’un cas arbitraire est O (1), au lieu de faire quelques comparaisons de cas avant de trouver celle que vous voulez.

Donc, dans de nombreux cas, un if / else if chaîne sera plus lente. Selon la fréquence à laquelle vos cas sont touchés, cela ne fait aucune différence.

Réponse courte: L’intervention est plus rapide

L’instruction if nécessite deux comparaisons (lors de l’exécution de votre code exemple) pour obtenir la bonne clause.

Le nombre moyen de comparaisons sera un énoncé sans tenir compte du nombre de cas différents que vous avez. Le compilateur / VM aura fait une “table de consultation” des options possibles au moment de la compilation.

Les machines virtuelles peuvent-elles optimiser l’instruction if de la même manière si vous exécutez souvent ce code?

Étant donné que l’instruction switch exprime la même intention que votre chaîne if / else mais de manière plus restreinte et formelle, vous devez d’abord estimer que le compilateur sera en mesure de l’optimiser, car il peut tirer davantage de conclusions sur les conditions placées sur votre code (c.-à-d. qu’un seul état peut être vrai, la valeur comparée est un type primitif, etc.) Il s’agit d’une vérité générale assez sûre lorsque vous comparez deux structures de langage similaires pour les performances d’exécution.

voir http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.switch%28VS.71%29.aspx

switch statement essentiellement une table de recherche, elle a des options connues et si statement est comme un type booléen. selon moi le commutateur et si-sinon sont les mêmes mais pour le commutateur logique peut aider plus mieux. tandis que sinon aide à comprendre aussi en lecture.