Aumente a precisão% e com o comando / usr / bin / time shell

19

Quando executo o comando time no shell time ./myapp, obtenho uma saída como a seguinte:

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

No entanto, quando executo o comando \time -f %e ./myapp, perco a precisão e recebo:

2.01s

Se eu usar o %Ecomando, também perco a precisão da mesma maneira. Como faço para alterá-lo para ter mais precisão novamente, mas ainda assim apenas os segundos são emitidos?

Baseei minha pesquisa neste comando Linux / Unix: tempo e nesta questão

Flame_Phoenix
fonte

Respostas:

21

Suponho que você entenda que esses dois comandos estão chamando uma versão diferente do tempo, certo?

versão incorporada do bash

% time

Tempo GNU aka. / usr / bin / time

% \time

O timecomando interno para bashpode ser lido aqui:

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

O GNU time, /usr/bin/time, é geralmente mais útil do que o embutido.

Quanto ao seu problema de precisão, é abordado aqui nesta essência do github , especificamente:

Por que o tempo do bash é mais preciso que o tempo do GNU?

O tempo do comando bash incorporado fornece precisão de execução em milissegundos, e o tempo GNU (geralmente / usr / bin / time) fornece precisão em centissegundos. O times (2) syscall fornece horários em relógios e 100 relógios = 1 segundo (geralmente), portanto, a precisão é semelhante ao tempo GNU. O que o tempo do bash está usando para que seja mais preciso?

O tempo do bash usa internamente getrusage () e o tempo do GNU usa times (). getrusage () é muito mais preciso devido à resolução de microssegundos.

Você pode ver os centisegundos com o seguinte exemplo ( consulte a 5a linha de saída ):

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

Pode-se obter mais resolução usando o timecomando do bash assim e você pode controlar a resolução:

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

No manual do Bash sobre variáveis :

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
fonte
Sim, eu já sabia tudo isso. Então eu posso concluir que o que eu quero é impossível? Existe uma maneira de usar a versão do horário do bash e obter apenas o tempo real dos segundos com 3 dígitos?
Flame_Phoenix 31/03
Veja minha atualização, você pode controlar o comando time do bash usando a variável TIMEFORMAT. É isso que você está procurando?
Slm
Sim, obrigado! Eu estou pensando, porém, como anexar isso a um arquivo? Estou tentando usar% TIMEFORMAT = '% 3R'; time (sleep .22222) >> bla.txt mas não está funcionando: S Enfim, selecionado. Eu gostaria de poder dar-lhe carma ++, mas não tenho 15 carma -.- '
Flame_Phoenix 31/03
2
TIMEFORMAT = '% 3R'; time (sleep .22222) 2 >> myFile.txt Vá em frente!
Flame_Phoenix 31/03
Usuário de longa data de ambos e que não conhecia TIMEFORMAT, sempre usei o sed para extrair em tempo real. Obrigado! O "por causa da resolução de microssegundos". A declaração colocou minhas esperanças de que TIMEFORMAT=%6Rfuncionaria, mas parece que o dígito de precisão pode ser apenas de 0 a 3.
mxmlnkn 14/12