Bash script: Midiendo el tiempo de ejecución de programas
El comando time en GNU/Linux nos permite conocer muchos detalles sobre el tiempo de ejecución de otro comando o aplicación que ejecutemos. Cuando ejecutamos el programa time sin ninguna opción obtenemos una salida similar a la siguiente
time comando argumentos ... salida comando ... real 0m0.010s user 0m0.010s sys 0m0.000s
Donde real indica el tiempo que ha pasado desde que se ejecuta el comando hasta que termina, user indica el tiempo usado por el proceso en modo usuario y sys muestra el tiempo usado por el sistema en manejar el proceso (modo kernel). Generalmente se coge como el tiempo de ejecución de un programa a la suma de las cantidades retornadas por user y sys, ya que si el sistema tiene una carga de procesamiento importante al ejecutar el programa que queremos analizar este puede tardar algo más de lo esperado y el valor real aumentaría.
El comando time es muy útil a la hora de realizar una comparación de rendimiento de diferentes aplicaciones. Sin embargo puede que nos encontremos con algunos problemas a la hora de interactuar con él dentro de nuestros bash scripts, y por ese motivo me he decidido a escribir esta entrada. El primer problema con el que me he encontrado es que al intentar guardar la salida del comando a un fichero, las estadísticas de tiempo obtenidas mediante time no se almacenan en el mismo, sino que se muestran por la salida estándar. Por ejemplo, si ejecutamos
time ls > aux.txt real 0m0.005s user 0m0.010s sys 0m0.000s
en el fichero aux.txt estará la salida del comando ls, pero no las estadísticas obtenidas por el comando time. Para solventar esta situación podemos usar el argumento “-o filename” guardando dichos valores en otro fichero. Sin embargo, la forma en la que time muestra por defecto el tiempo no es la más idónea ya que introduce carácteres como la “m” de minutos o la “s” de segundos que hacen más complicado después manejar dichas cantidades como número flotantes. Por lo tanto vamos a usar el argumento “-f FORMAT” para indicarle al comando time que nos muestre la salida con otro formato. Como solo nos interesan los valores de user y sys, la llamada será
/usr/bin/time -f "%U %S" -o fichero.txt comando
de forma que en el fichero.txt se almacenen los dos valores separados por un simple espacio. Fijaros que he llamado al comando time con su ruta completa. No se a que es debido, pero cuando ejecuto el comando sin especificar la ruta completa en mi distribución Ubuntu 9.10, no me reconoce ninguno de los parámetros que le paso.
Por último para obtener el tiempo de ejecución total debemos de sumar ambos valores, algo tremendamente sencillo para nuestro querido amigo awk:
awk '{print $1 + $2}' fichero.txt
Por lo tanto, en nuestro scripts nos bastará con introducir las dos siguientes líneas para obtener el tiempo de ejecución de un programa en la variable deseada
/usr/bin/time -f "%U %S" -o fichero.txt comando
TIME_PROC=`awk '{print $1 + $2}' fichero.txt`
loading...

loading...
Estimado,
Gracias por el artículo, me fue bastante útil. Sólo un alcance, al parecer la salida del time es por STDERR. Y STDERR está redireccionado hacia STDIN. Eso implica que si no se desea usar “-o”, bastaría con redireccionar 2>&1 y el comando a un archivo de salida. Atte.
Miguel Quintana.
loading...
Gracias Miguel por el apunte