web-dev-qa-db-fra.com

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

Je sais que c'est une micro-optimisation, donc je demande de pure curiosité.

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

Remarque, il s'agit de la programmation car elle affecte la vitesse d'exécution d'un programme.

53
Mackenzie

Habituellement, le microprocesseur compare en utilisant des portes électriques et non pas à pas comme ça. Il vérifie toutes les bits à la fois.

47
Mehrdad Afshari

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

Par exemple, sur X86, vous pouvez le voir en examinant comment le montage fonctionne. Découvrez les opérations - Opérations de flux de contrôle de l'assemblage X86 - Que vous faites l'égalité ou l'inégalité, cela est fait sous forme de 2 opérations.

Premièrement, vous faites une opération CMP (comparaison). Vous faites ensuite un chèque pour voir si la comparaison est égale, non égale, etc. Ceci ne vérifie que les résultats du comparateur - dans les deux cas, vous faites 2 opérations.

Dans de nombreuses langues de programmation de niveau supérieur, toutefois, les choses sont différentes. De nombreuses langues définissent l'inégalité en termes d'égalité - pour vérifier l'inégalité, vous faites la vérification de l'égalité, puis un deuxième chèque à voir si c'est faux. Cela entraîne une égalité (microscopique) plus rapide dans ces langues. De nombreuses langues vous permettent de rédiger spécifiquement les deux, mais beaucoup de gens ont tendance à écrire des inégalités en termes d'égalité, ce qui rend à nouveau l'égalité, en général, légèrement plus rapide.

29
Reed Copsey

On dirait que vous devriez lire le Manuel de référence d'optimisation des architectures Intel 64 et IA-32 .

Regardez là-bas pour la "latence de pipeline" et le "délai de pipeline" sur les instructions que vous utilisez. Il suffit de dire que tout ce que vous faites avec Ints prend environ 1 cycle d'horloge pour exécuter (4 milliards de ceux-ci une seconde). La lecture des données de la mémoire peut prendre 100-1000 en fonction de la quantité de données avec laquelle vous travaillez. Beaucoup plus important.

12
Tom Leys

La comparaison est généralement mise en œuvre comme une soustraction qui ignore le résultat. L'additionneur de la CPU fonctionnerait sur toutes les bits simultanément, il s'agit d'une opération de temps constante.

L'égalité ne vient alors que de déterminer si la sortie est 0. ON X86, il existe des indicateurs définis à la suite de la comparaison et la succursale est effectuée via JZ ou Jnz (saut si zéro, sautez sinon 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.

11
Michael

Les instructions elles-mêmes exécuteront à la même vitesse, car les autres réponses suggèrent.

Où vous pourriez rencontrer une différence serait dans la prévision de la branche ou les effets de cache. Cela variera d'un processeur au processeur et de compilateur au compilateur, il est donc impossible de faire des généralisations. Si vous êtes au niveau où cela ferait une différence, la seule façon de savoir est d'essayer et de mesurer.

3
Mark Ransom

Il y a quelques cas mineurs où il peut avoir un effet.

Sur ARM processeurs (pour l'architecture de jeu d'instructions 32 bits/sans thumb (ISA)), toutes les instructions sont conditionnelles. Parfois, vous pouvez vous échapper avec une boucle interne ayant une seule branche (de la fin au démarrage) malgré plusieurs conditions. Dans quelques cas ayant un comparateur logique (TEQ), il dérange peu de drapeaux (affecte négatif (n) et zéro (z), mais ne portent pas (c) ou débordement (c) ou débordement ( V)), Permet au code velu d'éviter une instruction de branche (innoge).

Inversement, IIRC (Je n'ai jamais réellement programmé, mais j'ai examiné la production d'un compilateur C sur une décennie il y a une décennie) 68000 dispose d'une instruction EORTH/XOR uniquement pour le registre D4. Donc, une comparaison arithmétique serait probablement meilleure (bien que vous puissiez toujours ignorer les drapeaux étrangers - le point est que le jeu d'instructions est un peu irrégulier).

Comme mentionné par une affiche précédente, la plupart des actions sont supérieures à la mémoire de la mémoire, du disque, du réseau et du service Web.

2

L'opération de comparaison se produit sur le bord montante (ou peut-être chuchoir) du signal d'horloge du microprocesseur. Ensuite, l'opération suivante se produit sur le prochain cycle d'horloge. Donc, en termes de vitesse d'exécution, d'égalité et d'inégalité, prenez le même temps pour presque tous les processeurs sur le marché aujourd'hui.

Je dis presque parce que je me souviens de lire sur certains processeurs qui étaient censés ne pas être basés sur l'horloge, mais basé sur le temps de fonctionnement, donc si la comparaison OP était plus rapide que l'ajout op, puis un ensemble de n compage prendrait moins de temps que n Ajoute. Mais j'ai environ 99% sûr que ce n'était qu'un projet de recherche et non un produit commercial :)

2
Mark Rushakoff

Le temps qu'il faut pour effectuer une comparaison comme celle-ci est généralement un cycle d'horloge.

Un processeur de 32 bits fera tous les 32 bits à la fois; Un 64 bits fera 64 bits à la fois.

S'il y a un retard ou un stand, dans le pipeline, ce serait parce que l'opérande n'est pas disponible et devait être récupéré. c'est où est la plus grande surcharge. Mais cela aurait été fait dans un morceau approprié pour l'architecture du processeur, il aurait donc toujours été tiré dans une unité de 32 ou 64 bits.

1
lavinio

Un aspect que tout le monde suppose, c'est qu'il parle d'instructions de niveau de registre. Tout le monde a raison, c'est fondamentalement discuté sur un niveau de processeur de la CPU. Et même plus élevé, la plupart des opérations de haut niveau écrivent l'inégalité en tant qu'appel à l'égalité.

Cependant, même plus élevé, l'utilisation de l'optimisation du questionneur fonctionnerait à la fois. C'est-à-dire que l'égalité peut être écrite aussi efficacement que l'inégalité.

De plus, au point de personnes concernées par les OP de l'Assemblée, la seule différence entre un CMP et un sous-traiteur sont les indignateurs définis. Ils sont généralement exécutés avec les mêmes parties de la machine depuis que CMP doit renvoyer des drapeaux qui représentent l'égalité, inférieure et supérieure à celle.

1
Adam Luter