¿Quiere saber cuánto tiempo dura un proceso y mucho más? El comando de tiempo de Linux devuelve estadísticas de tiempo, lo que le brinda información interesante sobre los recursos utilizados por sus programas.

el tiempo tiene muchos familiares

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).

Todos estos proyectiles incorporan su propio comando de tiempo, ya sea como incorporado comando o como un palabra reservada. Cuando escribe time en una ventana de terminal, el shell ejecutará su comando interno en lugar de utilizar el binario de tiempo 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.

¿A qué hora correrá?

Puede comprobar qué versión se ejecutará utilizando el comando type. 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 el tipo de palabra, un espacio y luego la palabra tiempo y presione Enter.

type time

escriba el tiempo en una ventana de terminal de bash

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

type time

escriba el tiempo en una ventana de terminal zsh

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

type time

escriba el tiempo en una ventana de shell de Korn

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

Ejecución del comando GNU time

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. Debes:

Proporcione la ruta completa al binario, como / usr / bin / time. Ejecute el comando what time para encontrar esta ruta.
Usa el tiempo de mando.
Use una barra invertida como el tiempo.

salida del comando de tiempo en una ventana de terminal

El comando which time 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 comando time que nos dice que no proporcionamos ningún parámetro de línea de comando para que funcione.

Escribir el comando time también funciona, y obtenemos la misma información de uso de time. El comando 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 el comando antes del nombre del comando.

La forma más sencilla de asegurarse de que está utilizando el binario de tiempo GNU es utilizar la opción de barra invertida.

time
time

salida de tiempo y tiempo en una ventana de terminal

time invoca la versión shell de time. el tiempo usa el binario de tiempo.

Usando el comando de tiempo

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[]="how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek";

 // get length of string once, outside of loops
 len = strlen( szString );  

 for (j=0; j

This is loop2.c. The length of the string is obtained time after time for every cycle of the outer loop. This inefficiency ought to show up in the timings.

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

int main (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

Let’s fire up the loop1 program and use time to measure its performance.

time ./loop1

resultados de tiempo para loop1 en una ventana de terminal

Ahora hagamos lo mismo con loop2.

time ./loop2

salida de tiempo para loop2 en una ventana de terminal

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 de loop1 nos dicen que loop1 pasó 0.09 segundos en modo de usuario. O pasó cero tiempo en modo kernel o el tiempo en modo kernel es un valor demasiado bajo para registrar 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 la duración de su tiempo total transcurrido.

El ineficiente programa loop2 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. Nada se registra para el modo kernel. loop2 recibió un promedio del 96% del tiempo de CPU durante su ejecución.

Formatear la salida

Puede personalizar la salida de vez en cuando utilizando una cadena de formato. La cadena de formato puede contener texto y especificadores de formato. La lista de especificadores de formato puede ser encontrado en la página del manual para el tiempo. Cada uno de los especificadores de formato representa un dato.

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 a tiempo 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 opción -f (cadena de formato) se usa para decirle a la hora 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 especificador de formato% C significa "Nombre y argumentos de línea de comando del comando que se está cronometrando". La 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 por sí mismo.

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 por el especificador de formato para el tiempo de CPU empleado en modo kernel, que es% S.

Finalmente, vamos a imprimir los caracteres “nCPU:” para darnos una nueva línea y el título de este valor de datos. El especificador de formato% P 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 caracteres t para colocar pestañas en la salida si fuéramos quisquillosos con la alineación de 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 la salida a un archivo

Para mantener un registro de los tiempos de las pruebas que ha realizado, puede enviar la salida de vez en cuando a un archivo. Para hacer esto, use la opción -o (salida). La salida de su programa seguirá mostrándose en la ventana del terminal. Solo la salida del tiempo se redirige al archivo.

Podemos volver a ejecutar la prueba y guardar la salida 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

Salida de la cadena de formato para loop1 canalizada al archivo en una ventana de terminal

La salida del programa loop1 se muestra en la ventana del terminal y los resultados del tiempo 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

Salida de la cadena de formato para loop2 agregada al archivo en una ventana de terminal

Ahora debería ser evidente por qué usamos el especificador de formato% C para incluir el nombre del programa en la salida de la cadena de formato.

Y estamos fuera de tiempo

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