Linux / Comando / time: medir el tiempo de ejecución y el uso de recursos
time mide el tiempo que tarda en ejecutarse un comando o una tubería y el tiempo de uso de la CPU. La palabra clave time de Bash puede medir comandos internos del shell, funciones y tuberías, mientras que el /usr/bin/time externo de GNU puede proporcionar detalles del uso de recursos como memoria y entrada/salida.
Para una verificación simple de velocidad, es conveniente usar Bash time, y si se necesitan estadísticas a nivel de sistema operativo como memoria máxima y fallos de página, es mejor ejecutar explícitamente el time externo.
¿Qué es el comando time?
En Bash, time es una palabra clave que se reconoce como sintaxis antes que un archivo ejecutable normal. Al ser una palabra clave, no solo puede medir un programa externo, sino también toda la tubería, funciones del shell y comandos internos.
Muchos sistemas Linux también tienen instalado un archivo ejecutable de GNU Time por separado. Aunque tienen el mismo nombre, sus opciones e información de salida son diferentes, así que verifique su entorno actual con el siguiente comando.
type -a time
command -V time
ls -l /usr/bin/time
Sintaxis básica de Bash time
time [-p] COMANDO [ARGUMENTOS ...]
time [-p] COMANDO1 | COMANDO2
Se antepone time al comando a medir.
time sleep 1
time find /usr -type f >/dev/null
Cuando el comando termina, generalmente se muestran los tres valores real, user y sys.
Significado de real, user y sys
| Elemento | Significado |
|---|---|
real |
Es el tiempo transcurrido real desde el inicio hasta el final. También incluye el tiempo esperado debido a la espera de disco, red y otros procesos. |
user |
Es el tiempo acumulado que el proceso ha utilizado la CPU en modo de usuario. |
sys |
Es el tiempo acumulado de CPU utilizado en modo kernel para el proceso. |
Si se utilizan múltiples núcleos o varios procesos en paralelo, user + sys puede ser mayor que real. Por el contrario, si la espera de entrada/salida es larga, real puede ser grande, pero el tiempo de CPU puede ser pequeño.
Medir todo el pipeline
La palabra reservada de Bash time mide hasta que todo el pipeline que sigue haya terminado.
time find /var/log -type f -print0 | xargs -r -0 wc -l >/dev/null
La opción -r es de GNU xargs y evita ejecutar wc si la búsqueda no devuelve archivos. Sin ella, un comando sin archivos podría leer la entrada estándar. Esta práctica lee el contenido de los archivos encontrados y puede ser costosa; use una carpeta de prueba para aprender. Si desea medir solo el primer programa, delimite explícitamente el alcance de la medición. El estado del último programa de la canalización no demuestra que toda la búsqueda haya sido correcta.
Medir varios comandos como una sola tarea
Si agrupa la lista de comandos en llaves o en un subshell, puede medir el tiempo total.
time {
make clean &&
make -j4
}
time (
cd /srv/app || exit 1
./build.sh
)
El grupo entre llaves se ejecuta en el shell actual y el de paréntesis en un subshell. En el primer ejemplo, && ejecuta la compilación solo si make clean termina correctamente. En el segundo, || exit 1 evita ejecutar build.sh desde otra ubicación cuando cd falla.
Formato de salida portátil -p
time -p sleep 1
-p utiliza la salida de formato POSIX real, user, sys. Es útil cuando se necesita analizar resultados de múltiples sistemas de manera simple, pero los requisitos de automatización que incluyen configuraciones regionales y precisión deben considerarse por separado.
Cambiar la salida de Bash con TIMEFORMAT
La salida de la palabra reservada Bash se puede ajustar con la variable TIMEFORMAT.
TIMEFORMAT='elapsed=%3R s user=%3U s sys=%3S s'
time sleep 1
| Formato | Significado |
|---|---|
%R |
Tiempo transcurrido |
%U |
Tiempo de CPU en modo usuario |
%S |
Tiempo de CPU en modo sistema |
%P |
Mostrar el uso de CPU en forma de porcentaje |
%% |
Símbolo literal de porcentaje |
TIMEFORMAT afecta a la shell actual. Para aplicarlo una sola vez, guarde el valor existente o configúrelo dentro de un sub-shell.
(
TIMEFORMAT='elapsed=%R s'
time ./job.sh
)
Usar GNU time externo
Para practicar los ejemplos de ./job.sh, cree un archivo nuevo en una carpeta de prueba con dos líneas: #!/usr/bin/env bash y sleep 1. En Linux, otorgue permiso de ejecución con chmod u+x job.sh. Los ejemplos de compilación requieren un proyecto propio con un Makefile y, en el segundo caso, un build.sh ejecutable en la ruta indicada. Sustituya /srv/app por la ruta real: medir un comando también ejecuta todas sus operaciones.
Para usar de manera segura las opciones de un comando externo, especifique la ruta completa.
/usr/bin/time ./job.sh
/usr/bin/time -v ./job.sh
-v muestra información detallada proporcionada por el sistema, como la memoria residente máxima, fallos de página, entrada/salida del sistema de archivos y cambios de contexto. Los elementos y valores realmente proporcionados pueden variar según el sistema operativo.
Opciones de uso frecuente de GNU time
| Opciones | Descripción |
|---|---|
-p |
Muestra el tiempo en formato POSIX. |
-v |
Muestra estadísticas de recursos disponibles en detalle. |
-f FORMATO |
Configura el contenido de salida mediante especificadores de formato. |
-o ARCHIVO |
Escribe los resultados medidos en un archivo especificado. |
-a |
Agrega a continuación sin sobrescribir el archivo -o. |
Muestra únicamente el tiempo y la memoria en el formato deseado
/usr/bin/time -f 'elapsed=%e max_rss=%MKB' ./job.sh
%e indica el tiempo transcurrido, y %M indica el tamaño máximo de memoria residente. Verifique la unidad y la compatibilidad según el manual de GNU Time y el sistema actual.
Guardar los resultados de la medición en un archivo
/usr/bin/time -v -o time-report.txt ./job.sh
/usr/bin/time -v -a -o time-report.txt ./job.sh
Con -o, GNU Time guarda su informe en el archivo indicado; la salida estándar y de errores del programa conservan sus propios destinos. La primera ejecución sobrescribe time-report.txt y -a añade los informes posteriores. Use una carpeta de prueba y no sobrescriba un informe que necesite conservar.
Razón por la que la salida de time aparece en el error estándar
La información de tiempo se muestra por defecto en el error estándar. Esto es para que los resultados de tiempo no se mezclen incluso si la salida estándar del comando medido se redirige a una tubería o archivo.
time ./job.sh >job-output.txt
Este comando guarda solo la salida estándar del trabajo en un archivo y muestra la información de tiempo en la terminal. Para redirigir solo la información de tiempo de las palabras reservadas de Bash, debe manejar todo el error estándar del grupo, pero esto puede incluir también el error estándar del trabajo en sí.
{ time ./job.sh >job-output.txt; } 2>time-and-errors.txt
Para separar únicamente el informe de tiempo, es más claro usar -o del GNU Time externo.
Puntos a tener en cuenta para una comparación precisa
- La primera ejecución y las ejecuciones posteriores pueden diferir debido a la caché del sistema de archivos, la compilación en tiempo de ejecución (JIT) y la reutilización de conexiones.
- Se controla la carga de fondo, la regulación de la frecuencia de la CPU y la competencia por recursos de la máquina virtual.
- Los comandos muy cortos pueden verse significativamente afectados por la sobrecarga de la propia medición.
- Se repite varias veces y se comparan la mediana o la distribución.
- El tiempo de ejecución puede variar según si el destino de la salida es la terminal o un archivo.
- También se verifica que la diferencia de velocidad no cambie los resultados reales de la tarea ni la tasa de errores.
Comparación de tiempo de Bash y /usr/bin/time
| Clasificación | Bash time |
GNU /usr/bin/time |
|---|---|---|
| Tipo | Palabras reservadas de Bash | Archivo ejecutable externo |
| Canalización (pipeline) | Es fácil medir toda la canalización directamente. | De forma predeterminada, ejecuta el programa que se especifica. |
| Funciones de shell y comandos incorporados | Se puede medir directamente. | Es difícil de ejecutar directamente sin pasar por un shell separado. |
| Información detallada de recursos | Se centra en estadísticas de tiempo básicas. | Proporciona estadísticas de memoria y entrada/salida, etc., con -v. |
| Personalización de salida | TIMEFORMAT |
-f, -o, -a |
Preguntas frecuentes
¿Puede el tiempo de usuario ser mayor que el tiempo real?
Es posible. Si el tiempo de CPU utilizado en varios procesos o núcleos de CPU se acumula, el tiempo de CPU de usuario puede ser mayor que el tiempo transcurrido real.
time -v no funciona.
Puede ser porque las palabras reservadas de Bash se interpretan primero. Si tiene instalado GNU Time, use la ruta completa como /usr/bin/time -v COMANDO.
time, ¿cambia el estado de salida del comando?
Generalmente devuelve el estado de salida del comando o del pipeline que se está midiendo. En los pipelines, el resultado puede variar según la configuración pipefail de Bash.
Para comparar otras herramientas, consulte la Lista de comandos de uso frecuente en Linux. Para consultar las reglas y opciones, use Manual de GNU Bash: Pipelines y la palabra reservada time y Manual de GNU Time: Invocando time.




