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?


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

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)'

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


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.


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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.