if-elif versus case
Tiempos de Ejecución en scripts
Cuando escribimos scripts en bash, queremos que estos sean lo más rápidos posibles (en la medida de lo posible).
Revisando algún script de otras personas, me he encontrado con scripts con estructuras "if-elif-else" que a su vez tenían otros "if-elif-else" dentro de ellos.
En otros casos para las mismas comprobaciones anidadas se realizan mediante bloques "case-esac".
¿Qué es más rápido if-elif o case?
Para comprobar cual es el tipo de comprobación más rápida a la hora de ejecutarse, he preparado tres scripts sencillos que realizan la misma operación.
Dos con if-elif-else y diferente forma de comprobación del valor, el otro se ha realizado unicamente con case.
Empezamos por revisar el código de ambos scripts:
- El código realizado con if-elif-else es mucho más compacto y ocupa menos líneas que si usamos case.
- El código del primer y segundo scripts, realizados con if-elif-else, difieren en la comprobación, uno mediante == y el otro mediante el operador -eq (equal).
- El código que usa case, quizás es más sencillo de leer y codificar.
El código esta preparado a propósito para realizar la 'peor comprobación' posible, se comprueba que el valor de A sea 1 (9 comprobaciones) y si se cumple se mira si el valor de B es 1 (otras 5 comprobaciones).
Según se cumple cada comprobación, se imprime un mensaje indicando que ha pasado por ella: 'Entrando en A' y 'Entrando en B'.
Tiempos de ejecución de los scripts
Para la comprobación de tiempos, vamos a utilizar la utilidad 'time'.
Al programa time se le pasa como parámetro un programa y cuando finaliza la ejecución de éste, muestra un resumen del consumo del sistema.
Explicación de valores devueltos por time
- real: Tiempo total empleado por el proceso en segundos
- user: Número total de segundos de CPU que el proceso consumió en modo de usuario
- sys: Número total de segundos de CPU que el proceso consumió en modo de núcleo
Lanzamos con time cada uno de los scripts y analizamos los resultados:
El resultado lo he dejado ordenado de peor a mejor resultado.
Se ve claramente que enfrentados los dos scripts con if-elif-else, al usar el tipo de comprobación -eq= frente a ==, ofrece mayores velocidades de ejecución.
En los tiempos de ejecución y consumo entre el mejor de los scripts if-elif-else frente al script que usa case, claramente el script ganador es del 'case'.
Nota: No hay que tomarse esto como normal general, todo depende del tipo de comprobaciones que realicemos (cadena, numérico, array) en un script y los consumos de la ejecución pueden ser diferentes, pudiendo dar mejores resultados las comprobaciones realizadas con if que las realizadas con case.