Non, il ne sera pas plus rapide sur la plupart des architectures. Vous ne l'avez pas précisé, mais sur x86, toutes les comparaisons intégrales seront typiquement implémentées en deux instructions machine :
- A
test
ou cmp
qui définit EFLAGS
- Et un
Jcc
instruction (saut) en fonction du type de comparaison (et de la disposition du code) :
-
jne
- Sauter si non égal --> ZF = 0
-
jz
- Saut si zéro (égal) --> ZF = 1
-
jg
- Sauter si plus grand --> ZF = 0 and SF = OF
- (etc...)
Exemple (édité pour la brièveté) Compilé avec $ gcc -m32 -S -masm=intel test.c
if (a < b) {
// Do something 1
}
Compile vers :
mov eax, DWORD PTR [esp+24] ; a
cmp eax, DWORD PTR [esp+28] ; b
jge .L2 ; jump if a is >= b
; Do something 1
.L2:
Et
if (a <= b) {
// Do something 2
}
Compile vers :
mov eax, DWORD PTR [esp+24] ; a
cmp eax, DWORD PTR [esp+28] ; b
jg .L5 ; jump if a is > b
; Do something 2
.L5:
Donc la seule différence entre les deux est un jg
par rapport à un jge
l'instruction. Les deux prendront le même temps.
J'aimerais répondre au commentaire selon lequel rien n'indique que les différentes instructions de saut prennent le même temps. Il est un peu difficile de répondre à cette question, mais voici ce que je peux dire : Dans le Référence du jeu d'instructions Intel ils sont tous regroupés sous une instruction commune, Jcc
(Saut si la condition est remplie). Le même regroupement est effectué sous le Manuel de référence sur l'optimisation dans l'annexe C. Latence et débit.
Latence - Le nombre de cycles d'horloge qui sont nécessaires pour que le noyau d'exécution pour achever l'exécution de toutes les opérations qui constituent une instruction.
Débit - Le nombre de cycles d'horloge nécessaires pour attendre avant que les ports d'émission soient libres d'accepter la même instruction à nouveau. Pour de nombreuses instructions, le débit d'une instruction peut être nettement inférieur à sa latence
Les valeurs pour Jcc
sont :
Latency Throughput
Jcc N/A 0.5
avec la note de bas de page suivante sur Jcc
:
7) La sélection des instructions de saut conditionnel doit être basée sur la recommandation de la section 3.4.1, " Optimisation de la prédiction des branches ", afin d'améliorer la prévisibilité des branches. Lorsque les branchements sont prédits avec succès, la latence de jcc
est effectivement nulle.
Donc, rien dans la documentation d'Intel ne traite jamais d'un Jcc
d'instructions différentes des autres.
Si l'on pense aux circuits réels utilisés pour mettre en œuvre les instructions, on peut supposer qu'il y aurait de simples portes ET/OU sur les différents bits de l'instruction. EFLAGS
pour déterminer si les conditions sont remplies. Il n'y a donc aucune raison pour qu'une instruction testant deux bits prenne plus ou moins de temps qu'une instruction n'en testant qu'un seul (sans tenir compte du délai de propagation de la porte, qui est bien inférieur à la période d'horloge).
Edit : Floating Point
Cela s'applique également à la virgule flottante x87 : (à peu près le même code que ci-dessus, mais avec double
au lieu de int
.)
fld QWORD PTR [esp+32]
fld QWORD PTR [esp+40]
fucomip st, st(1) ; Compare ST(0) and ST(1), and set CF, PF, ZF in EFLAGS
fstp st(0)
seta al ; Set al if above (CF=0 and ZF=0).
test al, al
je .L2
; Do something 1
.L2:
fld QWORD PTR [esp+32]
fld QWORD PTR [esp+40]
fucomip st, st(1) ; (same thing as above)
fstp st(0)
setae al ; Set al if above or equal (CF=0).
test al, al
je .L5
; Do something 2
.L5:
leave
ret
174 votes
Je ne vois aucune raison pour laquelle cette question devrait être fermée (et surtout pas supprimée, comme l'indiquent actuellement les votes) étant donné son importance historique, la qualité de la réponse, et le fait que les autres questions en tête de liste dans la section performance rester ouvert. Au mieux, il devrait être verrouillé. De plus, même si la question elle-même est mal informée/naïve, le fait qu'elle soit apparue dans un livre signifie que la désinformation originale existe quelque part dans des sources "crédibles", et cette question est donc constructive dans la mesure où elle contribue à la clarifier.
34 votes
Vous ne nous avez jamais dit quel livre à laquelle vous faites référence.
196 votes
Dactylographie
<
est deux fois plus rapide que de taper<=
.1 votes
C'est une excellente question et je serais intéressé de savoir comment cela fonctionne en impliquant un langage interprété tel que Python. Je pourrais envisager de poster une nouvelle question telle que "Est-ce que > est plus rapide que >= en Python ?" mais cela pourrait être considéré comme une question en double. Vos conseils sont les bienvenus.
10 votes
C'était vrai sur le 8086.
11 votes
Le nombre de votes positifs montre clairement qu'il y a des centaines de personnes qui sur-optimisent fortement.
0 votes
Après avoir lu les réponses, je dirais que "<" n'est jamais plus lent que "<=".
3 votes
Jonathan Reinhart, il n'y a jamais eu de livre. C'est un mensonge que j'ai dit quand j'étais plus jeune.
0 votes
Toutes les réponses semblent concerner C alors que la question est étiquetée C++ -- où on ne peut simplement pas dire, ce que
<
et<=
pourrait signifier pour una
...