Das Wichtigste zuerst: Müssen Sie das Programm optimieren? Haben Sie gemessen, um zu wissen, wo Sie es tun müssen? Ist es in dieser Funktion?
Bei primitiven Typen ist der zweite Vergleich die schnellste Operation, die es gibt. Die höheren Kosten des Vergleichs bestehen darin, das Element in das entsprechende Register zu laden, und das wird für den ersten Vergleich benötigt. Sobald dieser Vergleich ausgeführt ist, befindet sich der Wert bereits in einem Register, und die zweite Operation erfordert eine einzige Prozessoranweisung plus die möglichen Kosten für die Fehlvorhersage der Verzweigung.
Geht man von ganzzahligen Typen aus, so werden die Kosten für die Prozessorzeit des Algorithmus höchstwahrscheinlich von den Kosten der rekursiven Aufrufe dominiert, wenn der Compiler keine Tail-Recursion-Optimierung durchführen kann. Wenn Sie dies wirklich optimieren müssen, versuchen Sie, mit allen Optimierungsflags zu kompilieren, und analysieren Sie den Assembler, um festzustellen, ob die Tail-Recursion-Optimierung angewendet wird. Falls nicht, wandeln Sie den Algorithmus manuell von rekursiv in iterativ um.
Dies hat zwei Auswirkungen: Der Code wird unkenntlich gemacht (vermeiden Sie es, eine saubere Lösung zu ändern, wenn es nicht unbedingt notwendig ist) und es werden Funktionsaufrufe vermieden.
Wenn es sich um C++ handelt und der Typ komplex ist und die überladenen Vergleichsoperatoren teuer sind, ist die schnellste Leistungssteigerung die Implementierung einer compare
Methode, die eine negative Zahl zurückgibt für weniger als , 0
für gleich, und eine positive Zahl, wenn größer-als . Dann wird das Ergebnis vor den Vergleichen vorberechnet und dann werden nur ganzzahlige Prüfungen durchgeführt. Das wird die Gesamtkosten des Algorithmus auf eine einzige Verarbeitung der realen Objekte mit dem teuren Vergleich reduzieren und Sie in die ursprüngliche Annahme zurückversetzen.