Wie erhalte ich die Bash-Ausführungszeit in Millisekunden unter Mac OS X?

12

Ich habe überprüft diese , aber die Lösung zur Verfügung gestellt hat für mich keine Arbeit.

Mit Datum kann ich die Ausführungszeit in Sekunden erhalten:

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

Wenn ich dies jedoch versuche:

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

Wenn ich% N (wie oben) zum Datum hinzufüge, um die Genauigkeit von Nanosekunden zu erhalten, wird der folgende Fehler angezeigt: -bash: 1369320760N: Wert zu groß für Basis (Fehlertoken ist "1369320760N")

Weiß jemand, wie man die Ausführungszeit in Millisekunden mit bash unter Mac OS X misst?

Pacodelumberg
quelle
Benötigen Sie wirklich eine Nano-Sekunden-Auflösung? Mit diesem Ansatz haben Sie viel Aufwand. Mit # some work hereommited erhalte ich Zeiten von 0,2 bis 0,3 Sekunden - was sollte Null (oder zumindest konstant) sein, um Ihr Ziel zu erreichen. Während /usr/bin/time usleep 50000ergibt sich eine vernünftig stabile Zeit von 0,05 +/- 0,01 Sekunden. (Nur unter Linux getestet, weiß nicht, ob / usr / bin / time und / oder usleep unter OSX verfügbar ist.)
mpy
Sind Sie sicher, dass die interne Taktauflösung eine GENAUE Auflösung bis zur Nanosekunde bietet?
Mdpc

Antworten:

14

Da OSX ein BSD-ähnliches System ist, verfügt die Strftime-Bibliothek nicht über %N( http://www.freebsd.org/cgi/man.cgi?query=date )

Gibt Ihnen der timeBefehl bash builtin die Informationen, die Sie benötigen?

time some work here
Glenn Jackman
quelle
2
Vielen Dank, dass Sie klargestellt haben, dass die Zeit perfekt funktioniert und drei Ergebnisse liefert, aber ich muss speziell mit den Anfangs- und Endzeiten arbeiten.
Pacodelumberg
11

Ich würde diesen Weg gehen, wenn ich Millisekunden benötige und BSD das Datum nicht unterstützt +%s%N

perl -MTime::HiRes -e 'printf("%.0f\n",Time::HiRes::time()*1000)'
hpavc
quelle
Vielen Dank!!! Das ist DIE Lösung, über die niemand berichtet hat ...
Daniele B
3

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

Dies würde von Nanosekunden in Millisekunden umgerechnet.

Von @mpy date +%s.%Nfunktioniert.

Die Ausgabe unterscheidet sich jedoch zwischen Linux und OS X:
Linux: 1369322592.573787111
OS X:1369322610.N

zurückhaltend
quelle
Ich erhalte die folgende Fehlermeldung: -bash: 1369321446N: Wert zu groß für Basis (Fehler-Token ist "1369321446N") Dies funktioniert nicht in Mac OSX, ich
erhalte
Nun, das ist ärgerlich ... (auf falschem Fenster getestet) sieht den gleichen Fehler: /
demure
1
Sie müssen die Ausgabe date +%s.%Nnicht teilen, sondern nur verwenden (aber ich kann OSX nicht überprüfen; es funktioniert unter Linux). Aber das Problem ist dann, dass bash‚s $(( ))IMHO nicht in der Lage ist Gleitkommazahlen zu behandeln.
Mpy
@mpy Das funktioniert auf osx. Gleiches gilt für die ersten 10 Zeichen, verhält sich jedoch zwischen Linux und OS X unterschiedlich.
zurückhaltend
Bedeutet das, dass wir die Nano-Sekunden-Informationen nicht anhand des Datums erhalten können?
Pacodelumberg
3

Wenn Sie installieren coreutils, können Sie GNU Linux dateschriftlich verwenden gdate.

coreutils ist mit Homebrew erhältlich : brew install coreutils.

youyoup
quelle
1

Wie in der anderen Antwort erwähnt, unterstützt das Datum von OS X% N (Nanosekunden) nicht.

Könnten Sie die Befehle einfach als Skript speichern? Oder verwenden Sie eine Subshell oder Befehlsgruppe für sie:

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

Oder summieren Sie die Zeiten einzelner Befehle:

$ 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

Oder verwenden Sie eine Skriptsprache:

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

%.3fist ein Formatbezeichner für eine Gleitkommazahl mit 3 Dezimalstellen. Time.now ist eine Klassenmethode der Time-Klasse.

Lri
quelle
Vielen Dank für Ihre Antwort. Können Sie bitte den obigen Ruby-Code beschreiben?
Pacodelumberg
1
In ruby -e 'puts "%.3f" % Time.now', rubyruft das Ruby - Interpreter, -eführt das Skript aus, die in der Befehlszeile folgt. putsist Rubys printf(Art), Timeist ein Rubinobjekt und Time.nowist die Sekunden seit der Epoche. Durch %.3fTrimmen wird die Ausgabe auf 3 Dezimalstellen gekürzt, was Millisekunden entspricht (die Teile ".046" und ".943" der Ausgabe).
Olie
1
Außerdem timehandelt es sich um ein Befehlszeilentool, das angibt, wie lange es dauert, den folgenden Befehl auszuführen. Siehe man timefür weitere Details.
Olie
1

Glenn hat recht, timeist der Befehl, den Sie suchen, aber um die gewünschten Informationen zu analysieren, müssen Sie sie an einen anderen Prozessor wie weitergeben sed.

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

Dieser Befehl entfernt die Ausgabe des Befehls selbst (sendet sowohl Standard- als auch Fehlerausgaben an / dev / null) und übergibt die Zeitergebnisse an sed, wo Sie die entsprechenden Regeln zum Bearbeiten des Streams und der Ausgabe auswählen müssen der gewünschte Wert.

Zach Melnick
quelle