Zitat:
ohne Compileroptimierungen
Mit Optimierung sollte die Oder-Verknüpfungen ebenfalls X in das Register EAX optimieren. In diesem Moment sind beide Varianten exakt gleich effizient.
Die Gemeinsammkeit von CMP und SUB besteht darin das beides Subtraktionen sind die identisch die Falgs beeinflussen und durch die gleiche Recheneinheit im Silicon abgearbeitet werden. Der einzigste Unterschied ist das SUB eben das entstehende Resultat zurück ins Register schreibt. Die für beide Operationen nötigen Taktzyklen waren meines Wissen immer schon identisch. Da SUB aber das Register modifiziert entstehen sogar auf modernen CPU's sogenannte Pairing-Probleme im Instruction-Shuffling. Somit wäre sogar CMP effizienter da es in allen Piplines ohne Pairing-Problemen ausführbar ist. D.h. beide Befehle benötigen zwar nur 1 Taktzyklus, aber im falle von SUB könnte der nachfolgende Befehl ausgebremst werden. Im Falle von CMP ist dagegen die Wahrscheinlichkeit höher das der nachfolgende Befehl im gleichen Taktzyklus wie das CMP ausgeführt werden kann. Somit würde die piplined Architekture der modernen CPU's quasi in parallel den Programmcode abarbeiten was eben beim SUB weniger wahrscheinlich wäre.
Somit verbleibt nur ein Entscheidungskriterium: Welche Methode ist besser zu warten und leichter verständlich ?
Gruß Hagen