script - shell linux
Obtener el tiempo de ejecuciĆ³n del programa en el shell. (9)
El camino es
$ > g++ -lpthread perform.c -o per
$ > time ./per
la salida es >>
real 0m0.014s
user 0m0.010s
sys 0m0.002s
Quiero ejecutar algo en un shell de Linux en unas condiciones diferentes, y poder generar el tiempo de ejecución de cada ejecución.
Sé que podría escribir un script en perl o python que haría esto, pero ¿hay alguna manera de hacerlo en la shell? (que pasa a ser bash)
Para una medición delta línea por línea, pruebe gnomon .
Una utilidad de línea de comandos, un poco como ts de moreutils, para anteponer información de marca de tiempo a la salida estándar de otro comando. Útil para procesos de larga ejecución donde le gustaría tener un registro histórico de lo que está tomando tanto tiempo.
También puede usar las --high
y / o - --medium
para especificar un umbral de longitud en segundos, sobre el cual gnomon destacará la marca de tiempo en rojo o amarillo. Y también puedes hacer algunas otras cosas.
Puede obtener información mucho más detallada que el tiempo incorporado en bash (que menciona Robert Gamble) usando time(1) . Normalmente esto es /usr/bin/time
.
Nota del editor: para asegurarse de que está invocando el time
utilidad externo en lugar de la palabra clave de time
de su shell, invóquelo como /usr/bin/time
.
time
es una utilidad obligatoria de POSIX , pero la única opción que se requiere para admitir es -p
.
Las plataformas específicas implementan extensiones no estándar específicas: -v
trabaja con la utilidad de time
GNU , como se muestra a continuación (la pregunta está etiquetada como linux ); La implementación de BSD / macOS usa -l
para producir un resultado similar - vea man 1 time
.
Ejemplo de salida verbosa:
$ /usr/bin/time -v sleep 1
Command being timed: "sleep 1"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 1%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.05
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 0
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 210
Voluntary context switches: 2
Involuntary context switches: 1
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
Puedes usar time
y subshell ()
:
time (
for (( i=1; i<10000; i++ )); do
echo 1 >/dev/null
done
)
O en la misma concha {}
:
time {
for (( i=1; i<10000; i++ )); do
echo 1 >/dev/null
done
}
Si desea más precisión, use %N
con date
(y use bc
para la diferencia, porque $(())
solo maneja números enteros).
Aquí está cómo hacerlo:
start=$(date +%s.%N)
# do some stuff here
dur=$(echo "$(date +%s.%N) - $start" | bc)
printf "Execution time: %.6f seconds" $dur
Ejemplo:
start=$(date +%s.%N); /
sleep 0.1s; /
dur=$(echo "$(date +%s.%N) - $start" | bc); /
printf "Execution time: %.6f seconds/n" $dur
Resultado:
Execution time: 0.104623 seconds
Si pretende utilizar los tiempos posteriores para calcular, aprenda cómo usar la opción -f
de /usr/bin/time
para generar el código que ahorra tiempo. Aquí hay un código que utilicé recientemente para obtener y ordenar los tiempos de ejecución de una clase completa de programas para estudiantes:
fmt="run { date = ''$(date)'', user = ''$who'', test = ''$test'', host = ''$(hostname)'', times = { user = %U, system = %S, elapsed = %e } }"
/usr/bin/time -f "$fmt" -o $timefile command args...
Más tarde concatené todos los archivos $timefile
y $timefile
la salida a un intérprete Lua . Puedes hacer lo mismo con Python o bash o cualquiera que sea tu sintaxis favorita. Me encanta esta técnica.
Si solo necesita precisión para el segundo, puede usar la variable $SECONDS
incorporada, que cuenta la cantidad de segundos que el shell ha estado ejecutándose.
while true; do
start=$SECONDS
some_long_running_command
duration=$(( SECONDS - start ))
echo "This run took $duration seconds"
if some_condition; then break; fi
done
Utilice la palabra clave de time
incorporada:
$ help time time: time [-p] PIPELINE Execute PIPELINE and print a summary of the real time, user CPU time, and system CPU time spent executing PIPELINE when it terminates. The return status is the return status of PIPELINE. The `-p'' option prints the timing summary in a slightly different format. This uses the value of the TIMEFORMAT variable as the output format.
Ejemplo:
$ time sleep 2
real 0m2.009s user 0m0.000s sys 0m0.004s
#!/bin/bash
START=$(date +%s)
# do something
# start your script work here
ls -R /etc > /tmp/x
rm -f /tmp/x
# your logic ends here
END=$(date +%s)
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"