Zwiększ precyzję% e za pomocą polecenia / usr / bin / time shell


19

Kiedy uruchamiam komendę time w powłoce time ./myapp, otrzymuję dane wyjściowe podobne do następujących:

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

Jednak po uruchomieniu polecenia \time -f %e ./myapptracę precyzję i otrzymuję:

2.01s

Jeśli użyję %Epolecenia, tracę również precyzję w ten sam sposób. Jak mogę go zmienić, aby znów był bardziej precyzyjny, ale wciąż są wyświetlane tylko sekundy?

Swoje badania oparłem na tym poleceniu Linux / Unix: czas i to pytanie

Odpowiedzi:


21

Zakładam, że rozumiesz, że oba te polecenia wywołują inną wersję czasu, prawda?

wbudowana wersja bash

% time

Czas GNU aka. / usr / bin / time

% \time

Wbudowane timepolecenie, które bashmożna przeczytać tutaj:

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

GNU time, /usr/bin/timejest zwykle bardziej przydatne niż wbudowana.

Co do problemu to precyzyjnej pokryte tutaj w tym github GIST , w szczególności:

Dlaczego czas bash jest bardziej precyzyjny niż czas GNU?

Wbudowany czas polecenia bash daje milisekundową precyzję wykonania, a czas GNU (zwykle / usr / bin / time) daje precyzję centisekundową. Funkcja syscall times (2) podaje czasy w zegarach, a 100 zegarów = 1 sekunda (zwykle), więc precyzja jest jak czas GNU. Jaki jest czas bash, aby był bardziej precyzyjny?

Czas Bash wewnętrznie używa getrusage (), a czas GNU używa times (). getrusage () jest znacznie bardziej precyzyjny ze względu na rozdzielczość mikrosekundową.

Możesz zobaczyć centisekundy w następującym przykładzie ( patrz 5. wiersz wyniku ):

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

Więcej rozdzielczości można uzyskać za pomocą timepolecenia bash w taki sposób i możesz kontrolować rozdzielczość:

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

Z podręcznika Bash na temat zmiennych :

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.

tak, już to wszystko wiedziałem. Mogę więc stwierdzić, że to, czego chcę, jest niemożliwe? Czy istnieje sposób na użycie wersji czasu bash i uzyskanie rzeczywistego czasu z 3 cyframi?
Flame_Phoenix

Zobacz moją aktualizację, możesz kontrolować komendę bash za pomocą zmiennej TIMEFORMAT. Czy tego szukasz?
slm

Tak, to wszystko, dzięki! Zastanawiam się jednak, jak mogę dołączyć to do pliku? Próbuję użyć% TIMEFORMAT = '% 3R'; czas (sen .22222) >> bla.txt, ale to nie działa: S W każdym razie zaznaczone. Chciałbym móc dać ci karmę ++, ale nie mam 15 karmy -.- '
Flame_Phoenix

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

Długoletni użytkownik obu i nie wiedziałem o TIMEFORMAT, zawsze używałem seda do ekstrakcji w czasie rzeczywistym. Dzięki! „Ze względu na rozdzielczość mikrosekundową”. oświadczenie podniosło moje nadzieje, że TIMEFORMAT=%6Rto zadziała, ale wydaje się, że precyzyjna cyfra może wynosić tylko 0-3.
mxmlnkn
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.