117 votes

If vs commutateur Vitesse

Instructions Switch sont généralement plus rapides que les instructions if-else-if équivalentes (comme par exemple décrites dans cet article) en raison des optimisations du compilateur.

Comment fonctionne réellement cette optimisation ? Quelqu'un a-t-il une bonne explication ?

197voto

Konrad Rudolph Points 231505

Le compilateur peut construire sauter les tables, le cas échéant. Par exemple, lorsque vous utilisez le réflecteur de regarder le code généré, vous verrez que pour les énormes commutateurs sur les cordes, le compilateur va en fait générer du code qui utilise une table de hachage pour l'expédition de ces. La table de hachage utilise les chaînes de caractères comme des clés et des délégués à l' case de codes en tant que valeurs.

Cela a asymptotique meilleure exécution que beaucoup de enchaînés if tests et est en fait plus rapide, même pour relativement peu de chaînes de caractères.

29voto

Crashworks Points 22920

Konrad est correct. Dans le cas de mise en marche des plages contiguës d’entiers (par exemple, lorsque vous avez cas 0, cas 1, cas 2.. n cas), le compilateur peut faire quelque chose d’encore mieux car il n’a pas même besoin de construire une table de hachage ; Il enregistre simplement un tableau de pointeurs de fonction et ainsi peut charger sa cible de saut en temps constant.

16voto

olliej Points 16255

C'est une légère simplification typiquement moderne compilateur rencontre un if..else if .. séquence qui pourrait trivialement être converti en une instruction switch par une personne, le compilateur. Mais juste pour ajouter plus de plaisir que le compilateur n'est pas restreint par la syntaxe peut donc générer des "switch" comme des déclarations à l'interne qui ont un mélange de plages, des cibles uniques, etc-et ils peuvent (et vont) faire cela pour les deux switch et if..else.

Anyhoo, une extension à Konrad réponse est que le compilateur peut générer un saut de la table, mais ce n'est pas nécessairement garanti (ni souhaitable). Pour une variété de raisons de sauter tables de faire de mauvaises choses à la direction des prédicteurs sur les processeurs modernes, et les tableaux se faire de mauvaises choses pour le cache de comportement, par exemple.

switch(a) { case 0: ...; break; case 1: ...; break; }

Si un compilateur effectivement généré un saut de la table, pour cela, il serait probablement plus lent que la solution de rechange if..else if.. code de style en raison de la sauter table de vaincre direction de la prévision.

5voto

J.J. Points 3543

Comme dit Konrad le compilateur peut générer une table de saut.

En C++, une raison que possible est en raison de la limitation des commutateurs.

4voto

Calyth Points 1368

Les stats de non-match ne peuvent pas être bonnes.

Si vous téléchargez en fait la source, aucuns les valeurs de correspondance ne sont connus pour être 21, dans les deux cas et basculer l’affaire. Un compilateur doit être en mesure d’abstraire, sachant quel énoncé doit être exécuté à tout moment, et un CPU devrait être en mesure à la branche prédire correctement.

Le cas plus intéressant est lorsque pas tombe en tous les cas, à mon avis, mais qui a ne peut-être pas été la portée de l’expérience.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X