Lo primero es lo primero: ¿necesita optimizar el programa? ¿Has medido para saber dónde tienes que hacerlo? ¿Está en esta función?
Para tipos primitivos, la segunda comparación es una operación lo más rápida posible. El mayor costo de la comparación es cargar el elemento en el registro apropiado, y eso es necesario para la primera comparación. Una vez que se ejecuta la comparación, el valor ya está en un registro y la segunda operación toma una única instrucción del procesador más el posible costo de la predicción errónea de la bifurcación.
Suponiendo tipos integrales, el costo en el tiempo del procesador del algoritmo es muy probablemente dominado por el costo de las llamadas recursivas si el compilador no puede realizar la optimización de recursión de cola. Si realmente necesita optimizar esto, intente compilar con todos los indicadores de optimización y analizar el ensamblador para identificar si se está aplicando la optimización de recursión de cola. De lo contrario, convierta manualmente el algoritmo de recursivo a iterativo.
Esto tendrá dos efectos: oscurecer el código (evite modificar una solución limpia a menos que realmente lo necesite) y evitar llamadas de función.
si usted está hablando de C++, y el tipo es complejo y los operadores de comparación sobrecargados son caros, el impulso más rápido en el rendimiento está implementando un método compare
que devolverá un número negativo para menos-que, 0
por igual y un número positivo si mayor que. Luego, precompute el resultado antes de las comparaciones y luego realice solo las pruebas de enteros. Eso eliminará el costo total del algoritmo para un solo procesamiento de los objetos reales con la costosa comparación y lo retrotraerá a la suposición original.
Como siempre: ¿necesita ocultar el algoritmo para el rendimiento? ¿Esto está en la ruta del código crítico? ¿El rendimiento de este método específico afecta el rendimiento del programa en general? ¿Es debido a la comparación adicional? Mi apuesta es que la comparación adicional no tiene ningún efecto en general en el tiempo de ejecución del programa. Si realmente necesita optimizar el algoritmo, mida primero, luego piense en lo que está haciendo. Apuesto a que cambiar de recursivo a iterativo a) lo hará menos legible (así que solo hazlo si realmente lo necesitas) yb) mejorará la velocidad del tiempo de ejecución mucho más que la comparación. –
@David: en este caso, parece una pregunta académica importante de saber, y aplicar la optimización hace que el algoritmo sea más canónico. – Potatoswatter
@ David: Solo quería saber si es posible independientemente de la optimización o complejidad. @ Potatoswatter: la pregunta fue hecha una vez en los documentos de colocación de Adobe. Así que solo quería saber si es posible. Ahora también he publicado una posible solución por mi cuenta, pero todavía tengo curiosidad. Gracias Alok.Kr. –