Tout d'abord: avez-vous besoin d'optimiser le programme? Avez-vous mesuré pour savoir où vous devez le faire? Est-ce dans cette fonction?
Pour les types primitifs, la seconde comparaison est une opération aussi rapide que possible. Le coût plus élevé de la comparaison charge l'élément dans le registre approprié, ce qui est nécessaire pour la première comparaison. Une fois cette comparaison exécutée, la valeur est déjà dans un registre et la seconde opération prend une instruction de processeur unique plus le coût possible de l'erreur de branchement.
En supposant des types entiers, le coût en temps de processeur de l'algorithme est très probablement dominé par le coût des appels récursifs si le compilateur n'est pas capable d'effectuer une optimisation de récurrence de queue. Si vous avez vraiment besoin d'optimiser cela, essayez de compiler avec tous les indicateurs d'optimisation et analysez l'assembleur pour déterminer si l'optimisation tail-récursion est appliquée. Sinon, convertissez manuellement l'algorithme de récursif en itératif.
Cela aura deux effets: obscurcir le code (évitez de modifier une solution propre sauf si vous en avez vraiment besoin) et éviter les appels de fonction.
Si vous parlez de C++ et le type est complexe et les opérateurs de comparaison surchargées sont chers, le plus rapide coup de pouce de la performance met en œuvre une méthode compare
qui renverra un nombre négatif pour moins que, 0
pour l'égalité et un nombre positif si supérieur à. Ensuite, précalculez le résultat avant les comparaisons, puis effectuez des vérifications sur les entiers uniquement. Cela va supprimer le coût global de l'algorithme à un seul traitement des objets réels avec la comparaison coûteuse et vous remettre dans l'hypothèse originale.
Comme toujours: avez-vous besoin d'obscurcir l'algorithme pour la performance? Est-ce dans le chemin du code critique? La performance de cette méthode spécifique affecte-t-elle la performance du programme global? Est-ce dû à la comparaison supplémentaire? Mon pari est que la comparaison supplémentaire n'a aucun effet global dans l'exécution du programme. Si vous avez vraiment besoin d'optimiser l'algorithme, mesurez d'abord, puis pensez à ce que vous faites. Je parie que le passage de récursif à itératif a) le rendra moins lisible (donc ne le fais que si c'est vraiment nécessaire) et b) améliorera la vitesse d'exécution beaucoup plus que la comparaison. –
@David: Dans ce cas, il semble être une question académique importante à connaître, et l'application de l'optimisation rend l'algorithme plus canonique. – Potatoswatter
@ David: Je voulais juste savoir si cela est possible indépendamment de l'optimisation ou de la complexité. @ Potatoswatter: La question a été posée une fois dans les documents de placement Adobe. Donc je voulais juste savoir si c'est possible. J'ai maintenant aussi posté une solution possible par moi-même, mais toujours curieux. Merci à Alok.Kr –