Aumenta la precisione% e con il comando / usr / bin / time shell


19

Quando eseguo il comando time nella shell time ./myappottengo un output simile al seguente:

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

Tuttavia, quando eseguo il comando \time -f %e ./myappperdo precisione e ottengo:

2.01s

Se uso il %Ecomando, perdo anche la precisione allo stesso modo. Come posso cambiarlo per avere ancora più precisione, ma ho ancora solo i secondi che vengono emessi?

Ho basato la mia ricerca su questo comando Linux / Unix: tempo e su questa domanda

Risposte:


21

Suppongo che tu capisca che entrambi questi comandi stanno chiamando una versione diversa del tempo, giusto?

la versione integrata di bash

% time

Tempo GNU aka. / Usr / bin / ora

% \time

Il timecomando integrato per bashpuò essere letto qui:

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

La GNU time, di /usr/bin/timesolito è più utile di quella incorporata.

Per quanto riguarda il tuo problema di precisione è trattato qui in questa sintesi github , in particolare:

Perché il tempo bash è più preciso del tempo GNU?

Il tempo di comando incorporato bash offre una precisione di millisecondi di esecuzione e il tempo GNU (di solito / usr / bin / time) fornisce una precisione di centisecondi. Il times (2) syscall fornisce i tempi in clock e 100 clock = 1 secondo (di solito), quindi la precisione è come il tempo GNU. Cosa usa il tempo bash in modo che sia più preciso?

Il tempo di Bash utilizza internamente getrusage () e il tempo di GNU usa times (). getrusage () è molto più preciso a causa della risoluzione dei microsecondi.

Puoi vedere i centisecondi con il seguente esempio ( vedi 5a riga di output ):

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

Più risoluzione può essere ottenuta usando il timecomando di bash in questo modo e puoi controllarne la risoluzione:

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

Dal manuale di Bash sulle variabili :

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.

sì, lo sapevo già tutto. Quindi posso concludere che ciò che voglio è impossibile? C'è un modo per usare la versione del tempo bash e ottenere il tempo reale dei secondi con 3 cifre?
Flame_Phoenix

Vedi il mio aggiornamento, puoi controllare il comando time di bash usando la variabile TIMEFORMAT. È quello che stai cercando?
slm

Yah, tutto qui, grazie! Mi chiedo però, come posso aggiungerlo a un file? Sto cercando di usare% TIMEFORMAT = '% 3R'; time (sleep .22222) >> bla.txt ma non funziona: S Comunque, selezionato. Vorrei
poterti

2
TIMEFORMAT = '% 3R'; time (sleep .22222) 2 >> myFile.txt GOt it!
Flame_Phoenix

Utente da molto tempo di entrambi e non lo sapevo TIMEFORMAT, ho sempre usato sed per estrarre in tempo reale. Grazie! Il "a causa della risoluzione dei microsecondi". L'istruzione ha sollevato le mie speranze che TIMEFORMAT=%6Rfunzionasse ma sembra che la cifra di precisione possa essere solo 0-3.
mxmlnkn
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.