Me gustaría hacer lo siguiente en un punto de un script:
start_time=date
y esto después de que se haya ejecutado un proceso o procesos:
end_time=date
y luego haga esto:
elapsed=$end_time-$start_time echo "Total of $elapsed seconds elapsed for process"
¿Cómo haría esto?
Comentarios
-
/usr/bin/time your_script
… - Relacionado: stackoverflow.com/q/8903239/6843677
Responder
Utilice el tiempo desde época para identificar fácilmente un lapso de tiempo en un script
man date %s seconds since 1970-01-01 00:00:00 UTC %N nanoseconds (000000000..999999999)
.
start_time="$(date -u +%s)" sleep 5 end_time="$(date -u +%s)" elapsed="$(($end_time-$start_time))" echo "Total of $elapsed seconds elapsed for process" Total of 5 seconds elapsed for process
Bash no admite números de punto flotante, por lo que necesitará usar una herramienta externa como bc para comparar tiempos como 1475705058.042270582-1475705053.040524971
start_time="$(date -u +%s.%N)" sleep 5 end_time="$(date -u +%s.%N)" elapsed="$(bc <<<"$end_time-$start_time")" echo "Total of $elapsed seconds elapsed for process" Total of 5.001884264 seconds elapsed for process
Comentarios
Respuesta
bash tiene un variable de temporizador incorporada
start=$SECONDS # do stuff end=$SECONDS duration=$(( end - start )) echo "stuff took $duration seconds to complete"
Comentarios
- O
SECONDS=0; ...; echo "$SECONDS"
. Sin embargo, tenga cuidado con ese error .
Respuesta
@jasonwryan ya lo sugirió, pero lo incluiré como respuesta, ya que también es mi opción cuando quiero cronometrar un script. Para cronometrar myscript simplemente use:
time myscript
Comentarios
- Intentaré esto de vez en cuando, pero esto es más para cuando necesito aislar o cronometrar subsecciones de mi secuencia de comandos.
- Esto no es útil si desea utilizar el tiempo transcurrido derivado dentro de la secuencia de comandos en sí, por ejemplo, para calcular cuántas unidades pudo procesar la secuencia de comandos por segundo .
Respuesta
Me gusta la respuesta de @Miata porque llama la atención sobre date +%s
solución. Sin embargo, @Miata incluye .%N
pero no estoy seguro de qué beneficio obtendrás con los nanosegundos cuando existe el costo de ejecutar el date
comando en un subshell. Entonces, en la práctica, date +%s
debería ser suficiente. La otra cosa a tener en cuenta es date +%s
la época es 1970-01-01 00:00:00 UTC. Lo que significa que el tiempo tiene una época absoluta y puede compartir la medición del tiempo entre diferentes instancias de script de shell o diferentes máquinas.
(( start=$(date +%s) )) # 1604026743 # ... some activity that lasts for, say, 24 seconds (( end=$(date -u +%s) )) # 1604026767 (( duration=end-start )) # 24
Me gusta @glenn jackman » s respuesta porque se refiere a SECONDS
variable incorporada bash. Lo que hay que tener en cuenta aquí es que la época es el momento en que se inició el proceso. Por lo tanto, solo podemos usar esta técnica para medir los tiempos de las cosas que suceden dentro de ese script:
(( start=SECONDS )) # 10 # ... some activity that lasts for, say, 24 seconds (( end=SECONDS )) # 34 (( duration=end-start )) # 24
Otra cosa es que coloco todas mis asignaciones dentro de la (( ))
comando. es decir, puede reescribir:
cmd=$(( some_expression ))
como
(( cmd=some_expression ))
Al hacer esto , podemos minimizar la aparición del símbolo $
.
date '+%s.%N'
date -u
para evitar el horario de verano y problemas locales con el comando. lea esta respuestaelapsed=$(dc -e "$end_time $start_time - p")