Gibt es auf den modernen Prozessoren von heute einen Leistungsunterschied zwischen einem Vergleich größer als und größer als oder gleich für eine Verzweigungsbedingung? Wenn ich eine Bedingung habe, die genauso gut sein könnte, gibt es einen leichten Vorteil, wenn man >
über >=
wählt oder umgekehrt? (Dies wäre für eine kompilierte Sprache auf Intel oder AMD Hardware)
Es sollte keinen merklichen Unterschied zwischen dem Vergleichen verschiedener Prädikate geben, weil sie berechnet werden (Vorsicht, ich habe die x86-Handbücher nicht im Detail gelesen, damit sie anders funktionieren):
Die meisten Befehle erzeugen mehrere Flags als Nebenprodukt, normalerweise haben Sie mindestens: carry (c), overflow (o), null (z) und negativ (n).
Mit diesen Prädikaten, die von einer x-y-Anweisung erzeugt werden (die die obigen 4 zuverlässig erzeugt), können wir alle gewünschten Vergleiche leicht trivial ermitteln. Für vorzeichenlose Nummern:
%Vor%Es macht also kaum einen Unterschied. Aber dann gibt es einige Unterschiede, die meistens auf die Tatsache hinauslaufen, wenn wir TEST verwenden können (was ein AND anstelle einer vollständigen Subtraktion ist) oder CMP verwenden müssen (das ist die Subtraktion). TEST ist begrenzter, aber schneller (normalerweise).
Auch moderne Architekturen (ausgehend von c2d auf der Intel-Seite) können manchmal zwei μops zu einer Makro-Op-Fusion verschmelzen - eine sogenannte Makro-Op-Fusion, die einige schöne Vorteile bietet. Und die Regeln dafür ändern sich von einer Architektur zur nächsten und sind etwas länger. Zum Beispiel können Zweige, die nur das Überlauf-, Paritäts- oder Zeichenflag testen (JO, JNO, JP, JNP, JS, JNS) mit TEST verschmelzen, aber nicht mit CMP auf c2d und nehalems (Sie wetten, dass ich das oben geschaut habe - Abschnitt 7.5 ).
Also können wir einfach sagen, dass es kompliziert ist und sich keine Sorgen um solche Dinge machen? Das ist außer, wenn Sie einen Optimierer für einen Compiler schreiben, weil wirklich - unabhängig von WAS Sie in Ihren Quellcode schreiben, der Compiler tun wird, was er will - und aus gutem Grund (dh wenn JGE theoretisch schneller wären schreiben, wenn (x & lt; y) normalerweise ..). Und wenn Sie wirklich einen Rat brauchen: Vergleich mit 0 ist oft schneller.
Ich bin nicht ganz sicher, wie die zugrundeliegende Implementierung in der ALU / FPU durchgeführt wird, aber es sollte nur eine Operation für alle von ihnen geben (bei primitiven Typen ist das)
Ich hoffe wirklich, dass dies nur eine Frage ist, weil Sie neugierig sind und nicht, dass Sie versuchen, zu optimieren, dies wird Ihnen nie einen großen Leistungsschub bringen und höchstwahrscheinlich wird Ihr Code weit enthalten sein weit schlechtere Leistungsprobleme.
Sie können alle Beziehungsoperatoren mit nur einem Ereignis implementieren:
%Vor%Dies ist natürlich nicht, wie es in der CPU implementiert ist, das ist mehr Quiz.
Tags und Links optimization machine-instruction