viernes, 24 de septiembre de 2010

switch vs if (Java)

Basandome en que si lees esto ya conoces la estrucutra de un switch (sino lee el enlace) y de un case, paso a divagar sobre si es más eficiente un codigo de if-else encadenados o un switch, que realizarían la misma función, la diferencia fundamental en lo que a Java se refiere, está en que la codificacion del if else es un poco más larga y que el sqitch es menos conocido. Paritendo de aquí voy a entrar en lo que es más interesante, resulta que si no optimizamos el codigo del compilador, es decir el compilador puede decidir en donde poner cada estracto de codigo para funcionar de una forma más optima y por lo tanto el estudio previo que voy a hacer de seguido es basandome en que la maquina virtual no ha sido retocada ni utiliza un compilador que pueda restructurar el código (vale ya se que esto no es así de base, pero simplificando para el primer estudio, me vale).

Bien si tenemos en consideración esto, el codigo del switch siempre sería más efectivo que el del if-else, siempre y cuando existireran al menos dos opciones que evaluar, si solo hubiera una, entonces no serían iguales, ahora pensando en posibles anidamientos inferiores a los if-else (esto ya se sale de la idea previa) ek switch siempre es más efectivo o igual de efectivo al existir anidamientos inferiores a los casos de if-else, ya que elegiría su opción de forma directa y no evaluaría las opciones intermedias que puedieran existir en el encadenamiento de if-else.

Bien, una vez pensado en que podemos hacer, vayamos a lo que no podemos evaluar de forma sencilla con un if-else, reuslta que los casos de break; en un switch, dan una gran ventaja con respecto al if-else, ya qeu al cumplirse una condición superior, podríamos hacer que un switch siguiera ejecutando las opciones inferiores, si no utilizamos la clausula break, eso nos da una potencia que el encadenamiento de if-else, o if sencillos no nos podría dar, salvo un código muy grande, multiplicando el tiempo de compilación y ejecución.

Vale esto nos da una idea aproximada, resulta que siempre y cuando el número de opciones se pueda disparar, el switch, nos da una ventaja frente a los if. Pero vayamos a casos más avanzados, resulta que si queremos realizar una serie de acciones dependientes de una cantidad de condiciones compleja o de variables que se alejen de un caracter o un número, las opciones con el switch, se quedan no atrás sino a años luz, la potencia de los if en cuanto a la evaluación de condiciones son inmensas, en cambio el switch, solo puede evaluar una cantidad pequeña de condicionantes. Por lo que como resumen, o almenos como mi porpia conclusión diré que el switch aventaja al encadenamiento de if-else en cuanto a rendimiento, siempre y cuando las opciones sean evaluables con un switch, y siempre y cuando no sea necesario anidar estructuras complejas debajo de los casos a evaluar, ya que en ese caso, teniendo en cuanta que el compilador va a gestionar de forma lo más eficinete posible la localización del código, esto haría inservible el primer switch y convertiría todo en una maraña de anidamientos de la que no sería nada facil salir para el compilador, ralentizando de esta forma la mejora que se quería realizar.

Como idea final, decir que el if-else, será mejor para los casos complejos y los anidamientos, pero el swithc le sacará ventaja de rendimiento siempre y cuando las opciones sean evaluables y no exista  una gran complejidad debajo de cada opción.

1 comentario: