Erhöhen Sie die Genauigkeit von% e mit dem Shell-Befehl / usr / bin / time

19

Wenn ich den Befehl time in der Shell ausführe, time ./myapperhalte ich eine Ausgabe wie die folgende:

real    0m0.668s
user    0m0.112s
sys     0m0.028s

Wenn ich jedoch den Befehl ausführe, \time -f %e ./myappverliere ich die Genauigkeit und erhalte:

2.01s

Wenn ich den %EBefehl verwende, verliere ich in gleicher Weise auch die Genauigkeit. Wie ändere ich es wieder, um eine höhere Genauigkeit zu erzielen, aber es werden immer noch nur die Sekunden ausgegeben?

Ich habe meine Forschung in diesem Linux / Unix-Befehl: Zeit und auf dieser Frage basiert

Flame_Phoenix
quelle

Antworten:

21

Ich gehe davon aus, dass Sie verstehen, dass diese beiden Befehle eine andere Version der Zeit aufrufen, oder?

Bashs eingebaute Version

% time

GNU-Zeit aka. / usr / bin / time

% \time

Der eingebaute timeBefehl bashkann hier nachgelesen werden:

% 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.

Das GNU time, /usr/bin/timeist in der Regel nützlicher als die eingebaut.

Was Ihr Präzisionsproblem betrifft , wird es hier in diesem Github-Kern behandelt , und zwar:

Warum ist die Bash-Zeit genauer als die GNU-Zeit?

Die eingebaute Bash-Befehlszeit gibt die Genauigkeit der Ausführung in Millisekunden an, und die GNU-Zeit (normalerweise / usr / bin / time) gibt die Genauigkeit in Zentisekunden an. Der syscall times (2) gibt die Zeiten in Uhren an und 100 Uhren = 1 Sekunde (normalerweise). Die Genauigkeit entspricht also der GNU-Zeit. Wofür wird die Bash-Zeit verwendet, damit sie genauer ist?

Die Bash-Zeit verwendet intern getrusage () und die GNU-Zeit times (). getrusage () ist aufgrund der Mikrosekundenauflösung viel genauer.

Sie können die Centisekunden anhand des folgenden Beispiels sehen ( siehe 5. Ausgabezeile ):

% /usr/bin/time -v sleep .22222
    Command being timed: "sleep .22222"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 0%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.22
    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): 1968
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 153
    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

Mit dem bash- timeBefehl kann die Auflösung erhöht werden , und Sie können die Auflösung steuern:

# 3 places 
% TIMEFORMAT='%3R'; time ( sleep .22222 )
0.224

Aus dem Bash-Handbuch zu Variablen :

TIMEFORMAT
The value of this parameter is used as a format string specifying how the timing information for pipelines prefixed with the time reserved word should be displayed. The ‘%’ character introduces an escape sequence that is expanded to a time value or other information. The escape sequences and their meanings are as follows; the braces denote optional portions.

%%
A literal ‘%’.

%[p][l]R
The elapsed time in seconds.

%[p][l]U
The number of CPU seconds spent in user mode.

%[p][l]S
The number of CPU seconds spent in system mode.

%P
The CPU percentage, computed as (%U + %S) / %R.

The optional p is a digit specifying the precision, the number of fractional digits after a decimal point. A value of 0 causes no decimal point or fraction to be output. At most three places after the decimal point may be specified; values of p greater than 3 are changed to 3. If p is not specified, the value 3 is used.

The optional l specifies a longer format, including minutes, of the form MMmSS.FFs. The value of p determines whether or not the fraction is included.

If this variable is not set, Bash acts as if it had the value

$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'
If the value is null, no timing information is displayed. A trailing newline is added when the format string is displayed.
slm
quelle
ja das wusste ich schon alles. Daraus kann ich schließen, dass das, was ich will, unmöglich ist? Gibt es eine Möglichkeit, die Bash-Zeit-Version zu verwenden und nur die echte Sekundenzeit mit 3 Ziffern zu erhalten?
Flame_Phoenix
In meinem Update können Sie den Zeitbefehl von bash mit der Variablen TIMEFORMAT steuern. Ist es das, wonach du suchst?
slm
Yah, das war's, danke! Ich frage mich allerdings, wie ich das an eine Datei anhänge. Ich versuche,% TIMEFORMAT = '% 3R' zu verwenden. time (sleep .22222) >> bla.txt funktioniert aber nicht: S Wie auch immer, ausgewählt. Ich wünschte, ich könnte dir Karma ++ geben, aber ich habe nicht 15 Karma -.- '
Flame_Phoenix
2
TIMEFORMAT = '% 3R'; time (sleep .22222) 2 >> myFile.txt Los geht's!
Flame_Phoenix
Lange Zeit Benutzer von beiden und wusste nicht TIMEFORMAT, ich habe immer sed verwendet, um Echtzeit zu extrahieren. Vielen Dank! Das "wegen Mikrosekundenauflösung." Aussage setzte meine Hoffnungen, TIMEFORMAT=%6Rdie arbeiten würden, aber es scheint, dass die Präzisionsziffer nur 0-3 sein kann.
mxmlnkn