Come ottenere il tempo di esecuzione di Bash in millisecondi su Mac OS X?


12

Ho controllato questo , ma la soluzione fornita non ha funzionato per me.

Utilizzando la data posso ottenere il tempo di esecuzione in secondi:

T="$(date +%s)"
#some work here
T="$(($(date +%s)-T))"
echo "execution time (secs) ${T}"

Tuttavia, quando provo questo:

T="$(date +%s%N)"
#some work here
T="$(($(date +%s%N)-T))"

Aggiungendo% N (come sopra) alla data per ottenere la precisione in nano-secondo ottengo il seguente errore: -bash: 1369320760N: valore troppo grande per la base (il token di errore è "1369320760N")

Qualcuno sa come misurare il tempo di esecuzione in millisecondi usando bash in Mac OS X?


Hai davvero bisogno di una seconda risoluzione nano? Con questo approccio hai un sacco di spese generali. Con # some work hereommited, ottengo tempi da 0,2 a 0,3 secondi - ciò che dovrebbe essere zero (o almeno costante) per raggiungere il tuo obiettivo. Considerando che /usr/bin/time usleep 50000fornisce un tempo ragionevole ragionevole di 0,05 +/- 0,01 sec. (Testato solo su Linux, non so se / usr / bin / time e / o usleep sono disponibili su OSX.)
mpy

Sei sicuro che la risoluzione dell'orologio interno offra una risoluzione ACCURATA fino al nano-secondo livello?
mdpc,

Risposte:


14

Poiché OSX è un sistema BSD, la sua libreria strftime non ha %N( http://www.freebsd.org/cgi/man.cgi?query=date )

Il timecomando incorporato bash ti fornisce le informazioni di cui hai bisogno?

time some work here

2
grazie per averlo chiarito, il tempo funziona perfettamente e genera tre risultati, ma devo lavorare in modo specifico con i tempi iniziale e finale.
Pacodelumberg,

11

Vorrei seguire questa strada se avessi bisogno di millisecondi e BSD non supportasse la data +%s%N

perl -MTime::HiRes -e 'printf("%.0f\n",Time::HiRes::time()*1000)'

Grazie!!! Questa è LA soluzione che nessuno ha segnalato ...
Daniele B,

3

echo $(($(date +%s%N)/1000000))

Ciò si convertirà da nano-secondi a milli-secondi.

Da @mpy, date +%s.%Nfunziona.

L'output è diverso tra Linux e OS X:
Linux: 1369322592.573787111
OS X:1369322610.N


Ricevo il seguente errore: -bash: 1369321446N: valore troppo grande per la base (il token di errore è "1369321446N") questo non funziona in mac osx, sto ottenendo:
pacodelumberg,

Bene, questo è fastidioso ... (testato nella finestra sbagliata) vedendo lo stesso errore: /
demure

1
Non c'è bisogno di dividere l'output, basta usare date +%s.%N(ma non riesco a controllare su OSX; funziona su Linux). Ma il problema è allora, che bash's $(( ))IMHO non è in grado di gestire numeri in virgola mobile.
mpy

@mpy Funziona su osx. Lo stesso vale per i primi 10 caratteri, ma agisce diversamente tra Linux e OS X.
pudica

Ciò significa che non possiamo ottenere le nano seconde informazioni utilizzando la data?
Pacodelumberg,

3

Se installi coreutilspuoi usare GNU Linux datescrivendo gdate.

coreutils è disponibile con Homebrew: brew install coreutils.


1

Come menzionato nell'altra risposta, la data di OS X non supporta% N (nanosecondi).

Potresti semplicemente salvare i comandi in tempo come script? Oppure usa una subshell o un gruppo di comandi per loro:

time (sleep 0.1; echo a; sleep 0.1)
time { sleep 0.1; echo a; sleep 0.1; }

Oppure sommare i tempi dei singoli comandi:

$ time=$(TIMEFORMAT=%R; (time sleep 0.1; echo a) 2>&1 > /dev/null)
$ time+=+$(TIMEFORMAT=%R; (time sleep 0.1) 2>&1)
$ bc <<< $time
.206

O usa un linguaggio di scripting:

$ ruby -e 'puts "%.3f" % Time.now'
1369329611.046
$ time ruby -e '""'
0.029
$ time ruby -e 'puts "%.3f" % Time.now'
1369329622.943
0.029

%.3fè un identificatore di formato per un numero in virgola mobile con 3 punti decimali. Time.now è un metodo di classe della classe Time.


Grazie per la risposta, potresti descrivere il codice ruby ​​sopra?
Pacodelumberg,

1
In ruby -e 'puts "%.3f" % Time.now', rubychiama l'interprete ruby, -eesegue lo script che segue sulla riga di comando. putsè ruby printf(una specie di), Timeè un oggetto rubino ed Time.nowè i secondi dall'epoca. L'utilizzo %.3ftaglia l'output a 3 cifre decimali, che è millisecondi (le parti ".046" e ".943" dell'output.)
Olie

1
Inoltre, timeè uno strumento da riga di comando che indica il tempo necessario per eseguire il comando che segue. Vedi man timeper maggiori dettagli.
Olie,

1

Glenn ha ragione, timeè il comando che stai cercando, ma per analizzare le informazioni che desideri, dovrai passarle ad altri processori come sed.

time command-goes-here >/dev/null 2>$1|sed rules-go-here

Questo comando eliminerà l'output dal comando stesso (inviando output sia standard che di errore a / dev / null) e passerà i risultati del tempo a sed, dove sarà necessario scegliere le regole appropriate per modificare il flusso e l'output il valore desiderato.

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.