Vorrei fare quanto segue a un certo punto in uno script:
start_time=date
e dopo che uno o più processi sono stati eseguiti:
end_time=date
e poi:
elapsed=$end_time-$start_time echo "Total of $elapsed seconds elapsed for process"
Come potrei farlo?
Commenti
-
/usr/bin/time your_script
… - Correlati: stackoverflow.com/q/8903239/6843677
Risposta
Utilizza il tempo trascorso dallepoca per identificare facilmente un periodo di tempo in uno 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 non supporta i numeri in virgola mobile, quindi dovrai usare uno strumento esterno come bc per confrontare tempi come 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
Commenti
Risposta
bash ha un variabile timer incorporata
start=$SECONDS # do stuff end=$SECONDS duration=$(( end - start )) echo "stuff took $duration seconds to complete"
Commenti
- Oppure
SECONDS=0; ...; echo "$SECONDS"
. Attenzione però a quel bug .
Risposta
@jasonwryan lo ha già suggerito, ma lo inserirò come risposta poiché è anche il mio punto di riferimento quando voglio cronometrare uno script. Per cronometrare myscript usa semplicemente:
time myscript
Commenti
- Proverò di tanto in tanto ma è più per quando ne ho bisogno isolare o temporizzare le sottosezioni del mio script ..
- Questo non è utile se vuoi usare il tempo trascorso derivato allinterno dello script stesso, ad esempio per calcolare quante unità lo script è stato in grado di elaborare al secondo .
Risposta
Mi piace la risposta di @Miata perché richiama lattenzione su date +%s
soluzione. Tuttavia, @Miata include .%N
ma non sono sicuro di quale vantaggio otterrai guardando i nanosecondi quando cè il costo di esecuzione di date
comando in una subshell. Quindi, in pratica, date +%s
dovrebbe essere sufficiente. Laltra cosa da notare è date +%s
lepoca è 1970-01-01 00:00:00 UTC. Il che significa che il tempo ha unepoca assoluta e puoi condividere la misurazione del tempo tra diverse istanze di script di shell o macchine diverse.
(( start=$(date +%s) )) # 1604026743 # ... some activity that lasts for, say, 24 seconds (( end=$(date -u +%s) )) # 1604026767 (( duration=end-start )) # 24
Mi piace @glenn jackman ” s risposta perché si riferisce alla SECONDS
variabile incorporata di bash. La cosa da notare qui è che lepoca è lora in cui il processo è stato avviato. Quindi, possiamo usare questa tecnica solo per misurare i tempi per le cose che accadono allinterno di quello script:
(( start=SECONDS )) # 10 # ... some activity that lasts for, say, 24 seconds (( end=SECONDS )) # 34 (( duration=end-start )) # 24
Unaltra cosa è che metto tutti i miei compiti allinterno del (( ))
comando, cioè puoi riscrivere:
cmd=$(( some_expression ))
come
(( cmd=some_expression ))
In questo modo , possiamo ridurre al minimo la presenza del simbolo $
.
date '+%s.%N'
date -u
per evitare lora legale e problemi locali con il comando. leggi questa rispostaelapsed=$(dc -e "$end_time $start_time - p")