Cómo usar el comando time en Linux

¿Quieres saber cuánto tiempo lleva un proceso y mucho más? El comando time de Linux devuelve estadísticas de tiempo, brindándole información interesante sobre los recursos utilizados por sus programas.

→ Índice de contenidos

el tiempo tiene muchos parientes

Existen muchas distribuciones de Linux y varios 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).

Todos estos shells incorporan su propio comando de tiempo, ya sea como comando integrado o como palabra reservada. Cuando escribe la hora en una ventana de terminal, el shell ejecutará su comando interno en lugar de utilizar el binario de hora GNU proporcionado como parte de la distribución de Linux.

Queremos utilizar la versión GNU de Time porque tiene más opciones y es más flexible.

¿A qué hora funcionará?

Puede verificar qué versión se ejecutará usando el comando de tipo. type le permitirá saber si el shell manejará sus instrucciones por sí solo, con sus rutinas internas, o las pasará al binario GNU. En una ventana de terminal, escriba la palabra chicoun espacio y luego la palabra tiempoy presione Entrar.

type time

Podemos ver que en el shell bash el tiempo es una palabra reservada. Esto significa que Bash utilizará sus rutinas de tiempo internas de forma predeterminada.

type time

escriba la hora en una ventana de terminal zsh

En el shell Z (zsh), el tiempo es una palabra reservada, por lo que las rutinas internas del shell se utilizarán de forma predeterminada.

type time

escriba la hora en una ventana del shell Korn

En el shell Korn, el tiempo es una palabra clave. Se utilizará una rutina interna en lugar del comando de tiempo GNU.

Ejecutando el comando de tiempo GNU

Si el shell de su sistema Linux tiene una rutina de tiempo interna, deberá ser explícito si desea utilizar el binario de tiempo GNU. Tienes que:

  • Proporcione la ruta completa al archivo binario, por ejemplo /usr/bin/time. Ejecute el comando what time para encontrar esta ruta.
  • Uso command time.
  • Utilice una barra invertida como time.

generar el comando de tiempo en una ventana de terminal

EL which time El comando nos da la ruta al archivo binario.

Podemos probarlo usando /usr/bin/time como comando para iniciar el binario GNU. Eso funciona. Recibimos una respuesta de time comando que nos dice que no hemos proporcionado ningún parámetro de línea de comando para ejecutar.

Mecanografía command time funciona y del cual obtenemos la misma información de uso time. EL command El comando le dice al shell que ignore el siguiente comando para que se procese fuera del shell.

Usar una el carácter antes del nombre del comando es equivalente a usar command antes del nombre del comando.

La forma más fácil de asegurarte de que estás usando GNU time binario es utilizar la opción de barra invertida.

time
time

salida de tiempo y time en una ventana de terminal

time invoca la versión shell de time. time utilizar el time pistas.

Usando el comando de tiempo

Cronometremos algunos programas. Estamos usando dos programas llamados loop1 Y loop2. Fueron creados por loop1.c y loop2.c. No hacen nada útil más que demostrar los efectos de un tipo de ineficiencia de codificación.

Este es loop1.c. Se requiere la longitud de una cadena 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"
intmain(int argc, char* argv())
{
 int i, j, len, count=0;
 char szString()="how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek";
 
 len = strlen( szString );
 for (j=0; j<500000; j++) {
 for (i=0; i < len; i++ ) {
 if (szString(i) == '-')
 count++;
 }
 }
 printf("Counted %d hyphensn", count);
 exit (0);
}

Este es loop2.c. La longitud de la cuerda se obtiene cada vez para cada ciclo del bucle exterior. Esta ineficiencia debería manifestarse en el momento.

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
intmain(int argc, char* argv())
{
 int i, j, count=0;
 char szString()="how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek";
 for (j=0; j<500000; j++) {
 
 
 for (i=0; i < strlen(szString); i++ ) {
 if (szString(i) == '-')
 count++;
 }
 }
 printf("Counted %d hyphensn", count);
 exit (0);
}

encendamos el loop1 programa y uso time para medir su desempeño.

time ./loop1

resultados de sincronización para loop1 en una ventana de terminal

Ahora hagamos lo mismo para loop2.

time ./loop2

salida temporal para loop2 en una ventana de terminal

Esto nos dio dos conjuntos de resultados, pero están en un formato realmente feo. Podemos hacer algo al respecto más adelante, pero tomemos algo de información de los resultados.

Cuando se ejecutan programas, hay dos modos de ejecución entre los cuales se alternan. Estos se denominan modo de usuario y modo kernel.

En resumen, un proceso en modo de usuario no puede acceder directamente al hardware ni a la memoria de referencia fuera de su propia asignación. Para obtener acceso a estos recursos, el proceso debe realizar solicitudes al kernel. Si el kernel aprueba la solicitud, el proceso se ejecuta en modo kernel hasta que se cumpla el requisito. Luego, el proceso vuelve a ejecutarse en modo de usuario.

Los resultados para loop1 Dinos loop1 Pasó 0,09 segundos en modo usuario. O pasó cero tiempo en modo kernel o el tiempo en modo kernel es demasiado bajo para registrarlo cuando se redondea hacia abajo. El tiempo total transcurrido fue de 0,1 segundos. loop1 logró un promedio del 89% del tiempo de CPU durante el tiempo total transcurrido.

Los ineficientes loop2 ejecutar el programa tomó tres veces más. El 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 logró un promedio del 96% del tiempo de CPU durante su ejecución.

Formatear la salida

Puede personalizar la salida desde time usando 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. 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 letra P . indicar un time que un especificador de formato no es solo una letra normal, agréguele un signo de porcentaje, por ejemplo %P . Usémoslo en un ejemplo.

EL -f La 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 pase al programa). EL %C el especificador de formato significa "Nombre y argumentos de línea de comando del comando a tiempo". EL n hace que la salida se mueva a la siguiente línea.

Hay muchos especificadores de formato y distinguen entre mayúsculas y minúsculas, así que asegúrese de ingresarlos correctamente cuando lo haga usted mismo.

A continuación, imprimiremos los caracteres "Tiempo total: " seguidos del valor del tiempo total transcurrido para la ejecución de este programa (representado por %E).

Usamos n para dar otra nueva línea. Luego imprimiremos los caracteres "Modo(s) de usuario", seguidos del valor del tiempo de CPU pasado en modo de usuario, indicado 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 "Modo(s) de kernel", seguidos del especificador de formato para el tiempo de CPU pasado en modo kernel, que es %S.

Finalmente, imprimiremos los caracteres "nCPU: " para darnos una nueva línea y título para este valor de datos. El especificador de formato %P dará el porcentaje promedio de tiempo de CPU utilizado por el proceso cronometrado.

Toda la cadena de formato está entre comillas. Podríamos haber incluido algunos caracteres t para colocar pestañas en la salida si fuéramos exigentes a la hora de alinear los valores.

time -f "Program: %CnTotal time: %EnUser Mode (s) %UnKernel Mode (s) %SnCPU: %P" ./loop1

Salida de la cadena de formato para loop1 en una ventana de terminal

Enviar salida a un archivo

Para realizar un seguimiento de los tiempos de las pruebas realizadas, puede enviar el resultado de vez en cuando en un archivo. Para hacer esto use la opción -o (salida). La salida de su programa seguirá apareciendo en la ventana de la terminal. Es solo la salida del tiempo la que se redirige al archivo.

Podemos volver a ejecutar la prueba y guardar el resultado en el archivo test_results.txt de la siguiente manera:

time -o test_results.txt -f "Program: %CnTotal time: %EnUser Mode (s) %UnKernel Mode (s) %SnCPU: %P" ./loop1
cat test_results.txt

escriba la hora en una ventana de terminal bash

La salida del programa loop1 se muestra en la ventana de la terminal y los resultados de vez en cuando van al archivo test_results.txt.

Si desea capturar el siguiente conjunto de resultados en el mismo archivo, debe usar la opción -a (agregar) de la siguiente manera:

time -o test_results.txt -a -f "Program: %CnTotal time: %EnUser Mode (s) %UnKernel Mode (s) %SnCPU: %P" ./loop2
cat test_results.txt

escriba la hora en una ventana de terminal bash

Ahora debería quedar claro por qué utilizamos el especificador de formato %C para incluir el nombre del programa en la salida de la cadena de formato.

Y se nos acabó el tiempo

Probablemente muy útil para programadores y desarrolladores para ajustar su código, el comando time también es útil para cualquiera que quiera saber un poco más sobre lo que sucede bajo el capó cada vez que inicia un programa.

Subir Change privacy settings