Aumente la precisión de% e con el comando / usr / bin / time shell

19

Cuando ejecuto el comando time en shell time ./myappobtengo un resultado como el siguiente:

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

Sin embargo, cuando ejecuto el comando \time -f %e ./myapppierdo precisión y obtengo:

2.01s

Si uso el %Ecomando también pierdo precisión de la misma manera. ¿Cómo lo cambio para que tenga más precisión nuevamente, pero todavía solo se emiten los segundos?

Basé mi investigación en este comando Linux / Unix: tiempo y en esta pregunta

Llama_Phoenix
fuente

Respuestas:

21

Supongo que entiendes que ambos comandos están llamando a una versión diferente del tiempo, ¿verdad?

versión incorporada de bash

% time

Tiempo GNU aka. / usr / bin / time

% \time

El timecomando incorporado a bashse puede leer aquí:

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

El GNU time, por /usr/bin/timelo general, es más útil que el incorporado.

En cuanto a su problema de precisión, se trata aquí en este github gist , específicamente:

¿Por qué el tiempo bash es más preciso que el tiempo GNU?

El tiempo de comando bash incorporado proporciona una precisión de ejecución de milisegundos, y el tiempo GNU (generalmente / usr / bin / time) proporciona una precisión de centisegundos. El tiempo (2) syscall da tiempos en relojes, y 100 relojes = 1 segundo (generalmente), por lo que la precisión es como el tiempo GNU. ¿Qué usa bash time para que sea más preciso?

El tiempo bash usa internamente getrusage () y el tiempo GNU usa times (). getrusage () es mucho más preciso debido a la resolución de microsegundos.

Puede ver los centisegundos con el siguiente ejemplo ( consulte la quinta línea de salida ):

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

Se puede obtener más resolución usando el timecomando de bash de esta manera y puede controlar la resolución:

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

Del manual de Bash sobre variables :

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
fuente
Sí, ya sabía todo eso. ¿Entonces puedo concluir que lo que quiero es imposible? ¿Hay alguna manera de usar la versión bash time y solo obtener el tiempo real de segundos con 3 dígitos?
Flame_Phoenix
Vea mi actualización, puede controlar el comando de tiempo de bash usando la variable TIMEFORMAT. ¿Es eso lo que estás buscando?
slm
Yah, eso es, gracias! Sin embargo, me pregunto, ¿cómo agrego eso a un archivo? Estoy tratando de usar% TIMEFORMAT = '% 3R'; time (sleep .22222) >> bla.txt pero no funciona: S De todos modos, seleccionado. Desearía poder darte karma ++, pero no tengo 15 karma -.- '
Flame_Phoenix
2
TIMEFORMAT = '% 3R'; time (sleep .22222) 2 >> myFile.txt GOt it!
Flame_Phoenix
Usuario de ambos desde hace mucho tiempo y que no sabía TIMEFORMAT, siempre usé sed para extraer en tiempo real. ¡Gracias! El "debido a la resolución de microsegundos". La declaración puso mis esperanzas de que TIMEFORMAT=%6Rfuncionaría, pero parece que el dígito de precisión solo puede ser 0-3.
mxmlnkn