web-dev-qa-db-fra.com

Est-ce que "else if" est plus rapide que "switch ()"?

Duplicate possible:
Y a-t-il une différence significative entre utiliser if/else et switch-case en C #?

Je suis un ancien gars de Pascal, en train d'apprendre 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 l'interrupteur:

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 de déclarations "else if"). Devrais-je les transformer en interrupteurs?

337
Ivan Prodanov

Pour seulement quelques articles, la différence est petite. Si vous avez plusieurs objets, vous devez absolument utiliser un interrupteur.

Si un commutateur contient plus de cinq éléments, il est implémenté à l'aide d'une table de recherche ou d'une liste de hachage. Cela signifie que tous les éléments obtiennent le même temps d'accès, par rapport à une liste de if: s où le dernier élément prend beaucoup plus de temps à atteindre que l'évaluation préalable de chaque condition précédente.

565
Guffa

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

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

Il est peu probable que ces micro-optimisations affectent les performances de votre code.

De plus, si vous avez BESOIN de vous en soucier, vous devriez alors établir un profil de performances sur votre code. Dans ce cas, déterminer la différence de performances entre un commutateur et un bloc if-else serait trivial.

Edit: Par souci de clarté: implémentez la conception la plus claire et la plus facile à gérer. Généralement, face à un énorme cas de commutation ou de blocage, la solution consiste à utiliser le polymorphisme. Trouvez le comportement qui change et encapsulez-le. J'ai déjà eu à traiter avec un code aussi volumineux et laid que celui-ci et, en général, ce n'est pas si difficile à simplifier. Mais si satisfaisant.

167
Wedge

Croire cette évaluation de performance , le boîtier du commutateur est plus rapide.

Voici 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 de l'échelle if-else-if, le code doit traiter chaque instruction if dans l'ordre déterminé par le programmeur. Cependant, étant donné que chaque cas dans une instruction switch ne s'appuie 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.

27
Michael Klement

Autre chose à considérer: s'agit-il vraiment du goulot d'étranglement de votre application? Il existe des cas extrêmement rares où une optimisation de ce type est vraiment nécessaire. La plupart du temps, vous pouvez obtenir des améliorations beaucoup plus rapides en repensant vos algorithmes et structures de données.

14
Vilx-

Je dirais que le changement est la voie à suivre, c'est à la fois une pratique plus rapide et de meilleure qualité.

Divers liens tels que ( http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx ) affichent des tests comparatifs comparant les deux.

8
Shaun Bohannon

Ne devrait pas être difficile à tester, créez une fonction qui bascule ou ifelse entre 5 nombres, lancez un Rand (1,5) dans cette fonction et bouclez-le plusieurs fois tout en le chronométrant.

7
Ólafur Waage

Switch est généralement plus rapide qu'une longue liste de if, car le compilateur peut générer une table de saut. Plus la liste est longue, meilleure est la position d'un commutateur sur une série d'instructions if.

6
Steven

Je ne suis pas sûr, mais je crois 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 switch. De cette façon, le code est plus simple à lire.

5
user308693

Techniquement, ils produisent exactement le même résultat, ils doivent donc être optimisés à 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 une table de saut que le if.

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

5
jfclavette

Les problèmes de lisibilité sont bien plus importants que les avantages en termes de performances du commutateur (qui sont relativement légers, mais qu'il convient de noter).

Pour ma part, je trouve une instruction switch extrêmement claire quant à l’intention et aux espaces purs, par rapport aux chaînes de if.

5
annakata

switch est généralement traduit dans une table de recherche par le compilateur, si possible. Donc, la recherche d'un cas arbitraire est O (1), au lieu de faire quelques comparaisons de cas avant de trouver celui que vous voulez.

Ainsi, dans de nombreux cas, une chaîne if/else if sera plus lente. Cela dépend toutefois de la fréquence à laquelle vos cas sont traités.

4
Joey

Réponse courte: L'instruction Switch est plus rapide

L'instruction if nécessite deux comparaisons (lors de l'exécution de votre exemple de code) en moyenne pour obtenir la clause correcte.

L'instruction switch indique que le nombre moyen de comparaisons est un, quel que soit le nombre de cas différents que vous avez. Le compilateur/VM aura créé 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?

3
AnnaR

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

l'instruction switch est fondamentalement une table de correspondance, elle a des options connues et si l'instruction ressemble au type booléen. selon moi, commutateur et si-sinon sont identiques, mais pour un commutateur logique peut aider plus mieux. tandis que si-aide aide à comprendre en lecture aussi.

2
User42590

Puisque la déclaration switch exprime la même intention que votre chaîne if/else, mais de manière formelle et plus restreinte, vous devez d'abord vous attendre à ce que le compilateur puisse l'optimiser davantage , car il peut tirer davantage de conclusions sur les conditions placées sur votre code (c’est-à-dire qu’un seul état peut éventuellement être vrai, la valeur comparée est un type primitif, etc.) C’est une vérité générale assez sûre lorsque vous comparez deux langages similaires structures pour l'exécution d'exécution.

2
mqp