¿Quiere saber cuánto tiempo dura un proceso y mucho más? El time
comando de Linux devuelve estadísticas de tiempo, lo que le brinda información interesante sobre los recursos utilizados por sus programas.
Hay muchas distribuciones de Linux y diferentes sistemas operativos similares a Unix. Cada uno de estos tiene un shell de comandos predeterminado. El shell predeterminado más común en las distribuciones modernas de Linux es el shell bash. Pero hay muchos otros, como el shell Z (zsh) y el shell Korn (ksh).
Todas estas conchas incorporan su propio time
comando, ya sea como una función de mando o como una palabra reservada . Cuando escribe time
en una ventana de terminal, el shell ejecutará su comando interno en lugar de usar el time
binario GNU que se proporciona como parte de su distribución de Linux.
Queremos usar la versión GNU de time
porque tiene más opciones y es más flexible.
Puede verificar qué versión se ejecutará usando el type
comando. type
le permitirá saber si el shell manejará sus instrucciones por sí mismo, con sus rutinas internas, o las pasará al binario GNU.
en una ventana de terminal, escriba la palabra type
, un espacio y luego la palabra time
y presione Enter.
tiempo de tipo
Podemos ver que en el shell bash time
es una palabra reservada. Esto significa que Bash utilizará sus time
rutinas internas de forma predeterminada.
tiempo de tipo
En el shell Z (zsh) time
es una palabra reservada, por lo que las rutinas del shell interno se utilizarán de forma predeterminada.
tiempo de tipo
En el shell de Korn time
hay una palabra clave. Se utilizará una rutina interna en lugar del time
comando GNU .
Si el shell de su sistema Linux tiene una time
rutina interna , deberá ser explícito si desea utilizar el time
binario GNU . Debes:
/usr/bin/time
. Ejecute el which time
comando para encontrar esta ruta.command time
.\time
.El which time
comando nos da la ruta al binario.
Podemos probar esto usando /usr/bin/time
como comando para lanzar el binario GNU. Eso funciona. Recibimos una respuesta del time
comando que nos dice que no proporcionamos ningún parámetro de línea de comando para que funcione.
Escribir command time
también funciona y obtenemos la misma información de uso de time
. El command
comando le dice al shell que ignore el siguiente comando para que se procese fuera del shell.
Usar un \
carácter antes del nombre del comando es lo mismo que usar command
antes del nombre del comando.
La forma más sencilla de asegurarse de que está utilizando el time
binario GNU es utilizar la opción de barra invertida.
hora
\hora
time
invoca la versión shell de time. \time
usa el time
binario .
Midamos algunos programas. Estamos usando dos programas llamados loop1
y loop2
. Fueron creados a partir de loop1.cy loop2.c. No hacen nada útil aparte de demostrar los efectos de un tipo de ineficiencia de codificación.
Este es loop1.c. Se requiere la longitud de una cuerda dentro de los dos bucles anidados. La longitud se obtiene de antemano, fuera de los dos bucles anidados.
#include "stdio.h" #include "string.h" #include "stdlib.h" int main (int argc, char * argv []) { int i, j, len, count = 0; char szString [] = "cómo-geek-cómo-geek-cómo-geek-cómo-geek-cómo-geek-cómo-geek"; // obtiene la longitud de la cadena una vez, fuera de los bucles len = strlen (szString); para (j = 0; j <500000; j ++) { para (i = 0; i <len; i ++) { si (szString [i] == '-') contar ++; } } printf ("Contados% d guiones \ n", cuenta); salir (0); } // fin de main
Este es loop2.c. La longitud de la cuerda se obtiene una y otra vez para cada ciclo del bucle exterior. Esta ineficiencia debería reflejarse en los tiempos.
#include "stdio.h" #include "string.h" #include "stdlib.h" int main (int argc, char * argv []) { int i, j, count = 0; char szString [] = "cómo-geek-cómo-geek-cómo-geek-cómo-geek-cómo-geek-cómo-geek"; para (j = 0; j <500000; j ++) { // obteniendo la longitud de la cadena cada // tiempo que se disparan los bucles para (i = 0; i <strlen (szString); i ++) { si (szString [i] == '-') contar ++; } } printf ("Contados% d guiones \ n", cuenta); salir (0); } // fin de main
Arranquemos el loop1
programa y usemos time
para medir su desempeño.
\ time ./loop1
Ahora hagamos lo mismo por loop2
.
\ time ./loop2
Eso nos ha dado dos conjuntos de resultados, pero están en un formato realmente desagradable. Podemos hacer algo al respecto más tarde, pero escojamos algunos bits de información de los resultados.
Cuando los programas se ejecutan, hay dos modos de ejecución entre los que se alternan. Estos se denominan modo de usuario y modo de kernel .
En pocas palabras, un proceso en modo de usuario no puede acceder directamente al hardware o la memoria de referencia fuera de su propia asignación. Para obtener acceso a dichos recursos, el proceso debe realizar solicitudes al kernel. Si el kernel aprueba la solicitud, el proceso entra en ejecución en modo kernel hasta que se satisfaga el requisito. A continuación, el proceso vuelve a la ejecución en modo de usuario.
Los resultados loop1
nos dicen que loop1
pasaron 0.09 segundos en modo usuario. O pasó cero tiempo en modo kernel o el tiempo en modo kernel es un valor demasiado bajo para registrarlo una vez que se ha redondeado hacia abajo. El tiempo total transcurrido fue de 0,1 segundos. loop1
recibió un promedio del 89% del tiempo de CPU durante el tiempo total transcurrido.
El loop2
programa ineficaz tardó tres veces más en ejecutarse. Su tiempo total transcurrido es de 0,3 segundos. La duración del tiempo de procesamiento en modo usuario es de 0,29 segundos. No se registra nada para el modo kernel. loop2
recibió un promedio del 96% del tiempo de CPU durante la duración de su ejecución.
Puede personalizar la salida time
utilizando una cadena de formato. La cadena de formato puede contener texto y especificadores de formato. La lista de especificadores de formato se puede encontrar en la página de manual de time
. Cada uno de los especificadores de formato representa una pieza de información.
Cuando se imprime la cadena, los especificadores de formato se reemplazan por los valores reales que representan. Por ejemplo, el especificador de formato para el porcentaje de CPU es la letra P
. Para indicar time
que un especificador de formato no es solo una letra normal, agréguele un signo de porcentaje, como %P
. Usémoslo en un ejemplo.
La -f
opción (cadena de formato) se utiliza para indicar time
que lo que sigue es una cadena de formato.
Nuestra cadena de formato imprimirá los caracteres «Programa:» y el nombre del programa (y cualquier parámetro de línea de comando que le pase al programa). El %C
especificador de formato significa «Nombre y argumentos de la línea de comandos del comando que se está cronometrando». La \n
causa que la salida para pasar a la siguiente línea.
Hay muchos especificadores de formatos y distinguen entre mayúsculas y minúsculas, así que asegúrese de ingresarlos correctamente cuando esté haciendo esto por sí mismos.
A continuación, imprimiremos los caracteres “Tiempo total:” seguidos del valor del tiempo total transcurrido para esta ejecución del programa (representado por %E
).
Usamos \n
para dar otra nueva línea. A continuación, imprimiremos los caracteres «Modo (s) de usuario», seguidos del valor del tiempo de CPU empleado en modo de usuario, representado por %U
.
Usamos \n
para dar otra nueva línea. Esta vez nos estamos preparando para el valor de tiempo del kernel. Imprimimos los caracteres «Kernel Mode (s)», seguidos del especificador de formato para el tiempo de CPU empleado en modo kernel, que es %S
.
Finalmente, vamos a imprimir los caracteres “ \n
CPU:” para darnos una nueva línea y el título de este valor de datos. El %P
especificador de formato dará el porcentaje promedio de tiempo de CPU utilizado por el proceso temporizado.
Toda la cadena de formato está entre comillas. Podríamos haber incluido algunos \t
caracteres para colocar pestañas en la salida si fuéramos quisquillosos con la alineación de los valores.
\ time -f "Programa:% C \ nTiempo total:% E \ nModo (s) de usuario% U \ nModo (s) de Kernel% S \ nCPU:% P" ./loop1
Para mantener un registro de los tiempos de las pruebas que ha realizado, puede enviar la salida time
a un archivo. Para hacer esto use la -o
opción (salida). La salida de su programa seguirá mostrándose en la ventana del terminal. Solo la salida de la time
que se redirige al archivo.
Podemos volver a ejecutar la prueba y guardar la salida en el test_results.txt
archivo de la siguiente manera:
\ time -o test_results.txt -f "Programa:% C \ nTiempo total:% E \ nModo (s) de usuario% U \ nModo (s) de Kernel% S \ nCPU:% P" ./loop1
cat test_results.txt
La loop1
salida del programa se muestra en la ventana del terminal y los resultados time
van al test_results.txt
archivo.
Si desea capturar el siguiente conjunto de resultados en el mismo archivo, debe usar la -a
opción (agregar) de la siguiente manera:
\ time -o test_results.txt -a -f "Programa:% C \ nTiempo total:% E \ nModo (s) de usuario% U \ nModo (s) de Kernel% S \ nCPU:% P" ./loop2
cat test_results.txt
Ahora debería ser evidente por qué usamos el %C
especificador de formato para incluir el nombre del programa en la salida de la cadena de formato.
Probablemente sea de mayor utilidad para los programadores y desarrolladores para ajustar su código, el time
comando también es útil para cualquiera que desee descubrir un poco más sobre lo que sucede debajo del capó cada vez que inicia un programa.
El mundo del gaming ha experimentado un crecimiento exponencial en los últimos años. La…
Stokkete/Shutterstock.com ¿Sigue utilizando una unidad flash USB obsoleta para almacenar sus archivos? ¿Por qué no…
LG Los fabricantes siempre intentan mejorar el rendimiento de imagen de los monitores. Como resultado,…
Patty Chan/Shutterstock.com Si cree en lo que ve en las redes sociales, puede pensar en…
Seksan.TH/Shutterstock.com Los servicios de suscripción como Netflix, Game Pass y Spotify nos permiten consumir tantas…
fatmawati achmad zaenuri/Shutterstock El acceso a Internet, oa cualquier otra red, se rige por la…