Ich möchte an einer Stelle in einem Skript Folgendes tun:
start_time=date
und dies, nachdem ein oder mehrere Prozesse ausgeführt wurden:
end_time=date
und führen Sie dann Folgendes aus:
elapsed=$end_time-$start_time echo "Total of $elapsed seconds elapsed for process"
Wie würde ich das machen?
Kommentare
-
/usr/bin/time your_script
… - Verwandte Themen: stackoverflow.com/q/8903239/6843677
Antwort
Verwenden Sie die Zeit seit der Epoche, um eine Zeitspanne in einem Skript leicht zu identifizieren.
man date %s seconds since 1970-01-01 00:00:00 UTC %N nanoseconds (000000000..999999999)
.
start_time="$(date -u +%s)" sleep 5 end_time="$(date -u +%s)" elapsed="$(($end_time-$start_time))" echo "Total of $elapsed seconds elapsed for process" Total of 5 seconds elapsed for process
Bash unterstützt keine Gleitkommazahlen, daher müssen Sie ein externes Tool wie bc verwenden, um Zeiten wie zu vergleichen 1475705058.042270582-1475705053.040524971
start_time="$(date -u +%s.%N)" sleep 5 end_time="$(date -u +%s.%N)" elapsed="$(bc <<<"$end_time-$start_time")" echo "Total of $elapsed seconds elapsed for process" Total of 5.001884264 seconds elapsed for process
Kommentare
- das ist was Ich habe gesucht .. kann dies Mikrozeit einschließen?
- Versuchen Sie
date '+%s.%N'
- Sie sollten das Datum mit
date -u
aufrufen, um Sommerzeit und lokale Probleme mit dem Befehl zu vermeiden. Bitte lesen Sie diese Antwort - Da (traditionell) bc mit dc implementiert ist, können Sie dc direkt verwenden:
elapsed=$(dc -e "$end_time $start_time - p")
Antwort
bash hat eine integrierte Timer-Variable
start=$SECONDS # do stuff end=$SECONDS duration=$(( end - start )) echo "stuff took $duration seconds to complete"
Kommentare
- Oder
SECONDS=0; ...; echo "$SECONDS"
. Passen Sie jedoch auf diesen Fehler auf.
Antwort
@jasonwryan hat es bereits vorgeschlagen, aber ich werde es als Antwort einwerfen, da es auch meine Anlaufstelle ist, wenn ich ein Skript zeitlich festlegen möchte. Um myscript zeitlich festzulegen, verwenden Sie einfach:
time myscript
Kommentare
- Ich werde dies von Zeit zu Zeit versuchen, aber dies ist mehr, wenn ich muss Unterabschnitte meines Skripts isolieren oder zeitlich festlegen.
- Dies ist nicht hilfreich, wenn Sie die abgeleitete verstrichene Zeit im Skript selbst verwenden möchten, z. B. um zu berechnen, wie viele Einheiten das Skript pro Sekunde verarbeiten konnte .
Antwort
Ich mag die Antwort von @Miata, weil sie die Aufmerksamkeit auf Lösung. @Miata enthält jedoch .%N
, aber ich bin nicht sicher, welchen Nutzen Sie für Nanosekunden haben, wenn die Kosten für die Ausführung von date
anfallen Befehl in einer Unterschale. In der Praxis sollte also date +%s
ausreichend sein. Die andere Sache zu beachten ist date +%s
Epoche ist 1970-01-01 00:00:00 UTC. Das heißt, die Zeit hat eine absolute Epoche und Sie können die Zeitmessung zwischen verschiedenen Instanzen von Shell-Skripten oder verschiedenen Maschinen teilen.
(( start=$(date +%s) )) # 1604026743 # ... some activity that lasts for, say, 24 seconds (( end=$(date -u +%s) )) # 1604026767 (( duration=end-start )) # 24
Ich mag @glenn jackman “ s Antwort, weil sie sich auf die integrierte Variable SECONDS
bash bezieht. Hier ist zu beachten, dass die Epoche der Zeitpunkt ist, zu dem der Prozess gestartet wurde. Daher können wir diese Technik nur verwenden, um Messen Sie die Zeiten für Dinge, die in diesem Skript passieren:
(( start=SECONDS )) # 10 # ... some activity that lasts for, say, 24 seconds (( end=SECONDS )) # 34 (( duration=end-start )) # 24
Eine andere Sache ist, dass ich alle meine Zuweisungen in die (( ))
Befehl, dh Sie können Folgendes umschreiben:
cmd=$(( some_expression ))
als
(( cmd=some_expression ))
Auf diese Weise können wir das Auftreten des Symbols $
minimieren.