Euh, ce n'est pas bon
Cardinal = 4 Octets
Int64 = 8 Octets
Donc c'est soit 8 x 4 ou 4 x 8 mais juste 2 !
1 2 3 4
| False: (A: Array[1..4] of int64);
...
if A[1] OR A[2] OR A[3] OR A[4] = 0 then
begin |
Je ne suis pas sûr ces OR compile sans parenthèse, donc on en revient à
1 2 3 4
| False: (A: Array[1..4] of int64);
...
if (A[1] = 0) and (A[2] = 0) and (A[3] = 0) and (A[4] = 0) then
begin |
enfin A[1] OR A[2] = 0 n'est pas la même chose que (A[1] = 0) and (A[2] = 0).
Le résultat sera effectivement très proche si tous les bits sont a zéro, c'est bien vide mais en terme de compilation, cela n'a rien à voir et en perf, le OR binaire 32 ou 64 bit, doit être bien plus lent qu'un pauvre CMP\JZ
Sans parler de la plateforme cible du compilateur, sur un 32 bit le OR 64Bits est-il plus vraiment plus rapide que de deux 2 OR 32Bits ?
le OR de ta proposition est un OR binaire bit à bit
le AND de ma proposition est AND logique, ce dernier bénéficie de l'optimisation qui consiste à ne pas faire d'Evaluation booléenne complète, ainsi dès que le premier test est faux, les autres ne sont pas évalué !
Donc en conclusion si la syntaxe A[1] OR A[2] OR A[3] OR A[4] OR A[5]... compile
elle est plus lente car nécessite le calcul de tout les OR un par un
puis de la comparaison à Zéro ce qui est donc contre-performant
face à un code d'évaluation "court-circuit" des expressions booléennes !
Sinon on peut écrire cela via LongBool
if LongBool(A[1]) and LongBool(A[2]) and LongBool(A[3]) and LongBool(A[4]) and LongBool(A[5]) and LongBool(A[6]) and LongBool(A[7]) and LongBool(A[8]) then
Ce n'est pas forcément plus lisible, peut-être que le code ASM est légèrement différent mais Delphi est assez retord pour générer un code optimisé sur une égalité à zéro à coup de JZ !
Partager