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

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

Utilizzando la data posso get 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 get la precisione nano-secondo, ottengo il seguente errore: –bash: 1369320760N: valore troppo grande per la base (token di errore è "1369320760N")

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

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

Il command bash builtin time ti fornisce le informazioni necessarie?

 time some work here 

Vorrei andare questa rotta se avessi bisogno di millisecondi e BSD non ha supportto la data +%s%N

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

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

Questo converrebbe da nano-secondi a milli-secondi.

Da @mpy, la date +%s.%N funziona.

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

Come indicato dall'altra risposta, la data di OS X non support% N (nanosecondi).

Potresti semplicemente salvare i comandi a tempo come uno script? Oppure utilizzare un sottogruppo 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; } 

O sum 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 

Oppure utilizzare 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 indicatore di formato per un numero a virgola mobile con 3 punti decimali. Time.now è un metodo di class della class Time.

Glenn ha ragione, l' time è il command che stai cercando, ma per analizzare le informazioni che vuoi, sarà necessario passarlo lungo un altro processre come sed .

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

Questo command elimina l'output del command stesso (invio di standard e uscite di errore su / dev / null) e passerà i risultati dei tempi a sed, where sarà necessario scegliere le regole appropriate per modificare il stream e l'output il valore desiderato.

Se si installa coreutils è ansible utilizzare la date GNU Linux scrivendo gdate .

coreutils è disponibile con Homebrew: brew install coreutils .