55 votes

L'opérateur d'inégalité est-il plus rapide que l'opérateur d'égalité?

Je sais que ceci est une micro-optimisation, je demande donc par pure curiosité.

Logiquement, un microprocesseur n'a pas besoin de comparer tous les bits des deux opérandes d'un opérateur d'égalité pour déterminer un résultat "FALSE".

Notez que ceci est lié à la programmation car il affecte la vitesse d'exécution d'un programme.

49voto

Mehrdad Afshari Points 204872

Habituellement, le microprocesseur effectue des comparaisons en utilisant des portes électriques et non pas comme cela. Il vérifie tous les bits à la fois.

29voto

Reed Copsey Points 315315

Cela dépend de votre plate-forme, mais en général, il fonctionnera de la même manière.

Par exemple, sur les systèmes X86, vous pouvez le voir en regardant comment les travaux de l'assemblée. Découvrez le X86 assemblée de flux de contrôle des opérations - si vous êtes en train de faire de l'égalité ou de l'inégalité, il est fait comme 2 opérations.

D'abord, vous faites un CMP (comparaison) de l'opération. Ensuite, vous effectuez une vérification pour voir si la comparaison est égal, différent, etc. C'est juste vérifier les résultats de la comparaison dans les deux cas, vous êtes en train de faire 2 opérations.

Dans de nombreux de plus haut niveau des langages de programmation, cependant, les choses sont différentes. De nombreuses langues définir les inégalités en termes d'égalité de vérifier l'inégalité, vous ne le contrôle d'égalité, puis une deuxième vérification pour voir si c'est faux. Cela provoque l'égalité (au microscope) plus vite dans ces langues. De nombreuses langues vous permettent de spécifiquement écrire à la fois, en tant que bien, mais beaucoup de gens ont tendance à écrire les inégalités en termes d'égalité, ce qui rend à nouveau égalité, en général, un peu plus rapidement.

12voto

Tom Leys Points 10453

On dirait que vous devriez lire l' Intel ® 64 et IA-32 Optimisation des Architectures Manuel.

Regardez là-bas pour le "Pipeline de latence" et le "Pipeline retard" sur les instructions que vous utilisez. Autant dire que tout ce que vous faites avec ints prend environ 1 cycle d'horloge pour exécuter (4 milliards de personnes d'une seconde). La lecture des données à partir de la mémoire peut prendre 100-1000 selon la quantité de données que vous travaillez avec. Beaucoup plus important.

11voto

Michael Points 34110

La comparaison est généralement implémentée comme une soustraction qui ignore le résultat. L'additionneur de la CPU fonctionne sur tous les bits simultanément, il s'agit donc d'une opération à temps constant.

L'égalité consiste alors simplement à déterminer si la sortie est 0. Sur x86, des indicateurs sont définis à la suite d'une comparaison et la branche est créée via jz ou jnz (saut si zéro, saut si non zéro). Donc non, il n'y aurait pas de différence de vitesse réelle.

D'autres plates-formes (telles que ARM et IA64) se comportent de la même manière.

2voto

Mark Rushakoff Points 97350

L'opération de comparaison se produit sur la hausse (ou baisse) de la limite du microprocesseur du signal d'horloge. Alors la prochaine opération se produit sur le cycle d'horloge suivant. Donc, en termes de vitesse d'exécution, de l'égalité et de l'inégalité prendre la même quantité de temps pour presque chaque processeur sur le marché aujourd'hui.

Je dis presque parce que je me souviens avoir lu sur certains processeurs qui étaient censés ne pas être fondée sur l'horloge, mais l'opération elle-temps, de sorte que si, en effet, la comparaison de l'op a été plus rapide que le complément de l'op, puis un ensemble de n compare prendrait moins de temps que n ajoute. Mais je suis sur à 99% sûr que c'était juste quelques-projet de recherche et non pas un produit commercial :)

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