Stampa il tempo di esecuzione di un comando di shell


89

È possibile stampare il tempo di esecuzione di un comando di shell con la seguente combinazione?

root@hostname:~# "command to execute" && echo "execution time"

Risposte:


73

Non dimenticare che c'è una differenza tra il builtin di bash time(che dovrebbe essere chiamato di default quando lo fai time command) e /usr/bin/time(che dovrebbe richiedere di chiamarlo per il suo percorso completo).

Il builtin timestampa sempre su stderr, ma /usr/bin/timevi permetterà di inviare l'output di time a un file specifico, così non interferirete con il flusso stderr del comando eseguito. Inoltre, /usr/bin/timeil formato di è configurabile dalla riga di comando o dalla variabile d'ambiente TIME, mentre il timeformato incorporato di bash è configurato solo dalla TIMEFORMATvariabile d'ambiente.

$ time factor 1234567889234567891 # builtin
1234567889234567891: 142662263 8653780357

real    0m3.194s
user    0m1.596s
sys 0m0.004s
$ /usr/bin/time factor 1234567889234567891
1234567889234567891: 142662263 8653780357
1.54user 0.00system 0:02.69elapsed 57%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+215minor)pagefaults 0swaps
$ /usr/bin/time -o timed factor 1234567889234567891 # log to file `timed`
1234567889234567891: 142662263 8653780357
$ cat timed
1.56user 0.02system 0:02.49elapsed 63%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+217minor)pagefaults 0swaps

Da man bash: "La variabile TIMEFORMAT può essere impostata su una stringa di formato che specifica come devono essere visualizzate le informazioni sui tempi"
Dennis Williamson

Oops - pensavo ci fosse un modo per formattarlo, ma mi è sfuggito help timeperché l'ho solo guardato e ho pensato che fosse un argomento della riga di comando. Aggiornerò la risposta.
Mark Rushakoff

3
Qui siamo 9 anni dopo e il comando ha richiesto solo 0m0.018s. Ho solo pensato di farlo notare.
Ghassen Louhaichi

112

time è un comando integrato nella maggior parte delle shell che scrive le informazioni sul tempo di esecuzione nella tty.

Potresti anche provare qualcosa di simile

start_time=`date +%s`
<command-to-execute>
end_time=`date +%s`
echo execution time was `expr $end_time - $start_time` s.

Oppure in bash:

start_time=`date +%s`
<command-to-execute> && echo run time is $(expr `date +%s` - $start_time) s

d'accordo con Maaza, questa flessibilità mi ha permesso di misurare il tempo di un'intera serie di comandi.
Nath

È possibile applicare gli aspetti di Linux attorno a qualsiasi comando Linux per calcolare l'esecuzione
Syed Mazreena

2
Uno svantaggio di questo approccio è che misura in secondi, mentre timeutilizza i millisecondi. E se vuoi cronometrare una manciata di comandi insieme senza dover usare variabili e calcoli, puoi usare le parentesi: time ( command1 ; command2 ; command3 )potresti persino cronometrarli individualmente insieme al tempo totale, in questo modo: time ( time command1 ; time command2 ; time command3 ) Ovviamente, se vuoi una ventina di comandi, potresti è meglio usare la soluzione di questa risposta. Ma poi, dovresti iniziare a pensare di mettere tutti i tuoi comandi in uno script ...
msb

26
root@hostname:~# time [command]

Inoltre distingue tra tempo reale utilizzato e tempo di sistema utilizzato.


Questa è certamente la risposta di base, ma ci sono alcune complicazioni se si desidera vedere l'output dell'errore dal comando e allo stesso tempo inviare le informazioni sui tempi all'output standard come fa la domanda. Il comando time scrive in stderr. Quello che suggerisci è probabilmente abbastanza accurato, da cui il mio +1.
Jonathan Leffler

2
timescrive su tty, non su stderr. Il che immagino che peggiori le cose.
mafia

13

Per una misurazione delta riga per riga, provare gnonom .

È un'utilità della riga di comando, un po 'come ts di moreutils, per anteporre le informazioni di timestamp allo standard output di un altro comando. Utile per processi di lunga durata in cui desideri una registrazione storica di ciò che impiega così tanto tempo.

Piping qualsiasi cosa a gnomon anteporrà un timestamp a ciascuna riga, indicando per quanto tempo quella riga era l'ultima riga nel buffer, ovvero quanto tempo ha impiegato la riga successiva per apparire. Per impostazione predefinita, gnomon mostrerà i secondi trascorsi tra ogni riga, ma questo è configurabile.

demo di gnomon


8

Aggiunta alla risposta di @ mob:

Aggiungere %Na date +%sci dà una precisione al nanosecondo:

start=`date +%s%N`;<command>;end=`date +%s%N`;echo `expr $end - $start`

5

Se sto avviando un processo di lunga durata come una copia o un hash e voglio sapere in seguito quanto tempo ci è voluto, lo faccio semplicemente:

$ date; sha1sum reallybigfile.txt; date

Che risulterà nel seguente output:

Tue Jun  2 21:16:03 PDT 2015
5089a8e475cc41b2672982f690e5221469390bc0  reallybigfile.txt
Tue Jun  2 21:33:54 PDT 2015

Certo, come implementato qui non è molto preciso e non calcola il tempo trascorso. Ma è semplice e a volte tutto ciò di cui hai bisogno.


4

In zsh puoi usare

=time ...

In bash o zsh puoi usare

command time ...

Questi (con meccanismi diversi) forzano l'uso di un comando esterno.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.