453 Stimmen

Programmausführungszeit in der Shell abfragen

Ich möchte etwas in einer Linux-Shell unter verschiedenen Bedingungen ausführen und in der Lage sein, die Ausführungszeit für jede Ausführung auszugeben.

Ich weiß, ich könnte ein Perl- oder Python-Skript schreiben, das dies tut, aber gibt es eine Möglichkeit, wie ich es in der Shell tun kann (die zufällig Bash ist)?

580voto

Robert Gamble Punkte 101657

Verwenden Sie die integrierte time Stichwort:

$ help time

time: time \[-p\] PIPELINE
    Execute PIPELINE and print a summary of the real time, user CPU time,
    and system CPU time spent executing PIPELINE when it terminates.
    The return status is the return status of PIPELINE.  The \`-p' option
    prints the timing summary in a slightly different format.  This uses
    the value of the TIMEFORMAT variable as the output format.

Beispiel:

$ time sleep 2

real    0m2.009s
user    0m0.000s
sys     0m0.004s

135voto

grepsedawk Punkte 5861

Sie können viel detailliertere Informationen erhalten als die in der Bash integrierten time (d.h. Zeit(1) (die Robert Gamble erwähnt). Normalerweise ist dies /usr/bin/time .

Anmerkung der Redaktion: Um sicherzustellen, dass Sie die externes Dienstprogramm time und nicht die Ihrer Shell time Stichwort rufen Sie es auf als /usr/bin/time . time ist eine POSIX-mandatiertes Dienstprogramm , aber die einzige Option, die er unterstützen muss, ist -p . Bestimmte Plattformen implementieren spezifische, nicht standardisierte Erweiterungen: -v arbeitet mit GNU 's time Nutzen, wie unten gezeigt (die Frage ist mit linux ); die BSD/macOS-Implementierung verwendet -l um ähnliche Ergebnisse zu erzielen - siehe man 1 time .

Beispiel für eine ausführliche Ausgabe:

$ /usr/bin/time -v sleep 1
       Command being timed: "sleep 1"
       User time (seconds): 0.00
       System time (seconds): 0.00
       Percent of CPU this job got: 1%
       Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.05
       Average shared text size (kbytes): 0
       Average unshared data size (kbytes): 0
       Average stack size (kbytes): 0
       Average total size (kbytes): 0
       Maximum resident set size (kbytes): 0
       Average resident set size (kbytes): 0
       Major (requiring I/O) page faults: 0
       Minor (reclaiming a frame) page faults: 210
       Voluntary context switches: 2
       Involuntary context switches: 1
       Swaps: 0
       File system inputs: 0
       File system outputs: 0
       Socket messages sent: 0
       Socket messages received: 0
       Signals delivered: 0
       Page size (bytes): 4096
       Exit status: 0

94voto

David Punkte 1065
#!/bin/bash
START=$(date +%s)
# do something
# start your script work here
ls -R /etc > /tmp/x
rm -f /tmp/x
# your logic ends here
END=$(date +%s)
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"

48voto

Adriano Resende Punkte 2329

Für eine zeilenweise Deltamessung versuchen Sie Gnomon .

$ npm install -g gnomon
$ <your command> | gnomon --medium=1.0 --high=4.0 --ignore-blank --real-time=100

Ein Kommandozeilenprogramm, ähnlich wie ts von moreutils, das der Standardausgabe eines anderen Befehls Zeitstempelinformationen voranstellt. Nützlich für langlaufende Prozesse, bei denen man eine historische Aufzeichnung darüber haben möchte, was so lange dauert.

Sie können auch die --high und/oder --medium können Sie einen Schwellenwert in Sekunden angeben, bei dessen Überschreitung gnomon den Zeitstempel rot oder gelb markiert. Und Sie können auch noch einige andere Dinge tun.

example

23voto

Benoit Duffez Punkte 10830

Wenn Sie mehr Präzision wünschen, verwenden Sie %N con date (und verwenden bc für den Diff, weil $(()) verarbeitet nur ganze Zahlen).

Und so geht's:

start=$(date +%s.%N)
# do some stuff here
dur=$(echo "$(date +%s.%N) - $start" | bc)

printf "Execution time: %.6f seconds" $dur

Beispiel:

start=$(date +%s.%N); \
  sleep 0.1s; \
  dur=$(echo "$(date +%s.%N) - $start" | bc); \
  printf "Execution time: %.6f seconds\n" $dur

Ergebnis:

Execution time: 0.104623 seconds

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X