Збільшити% e точності за допомогою команди / usr / bin / time shell


19

Коли я запускаю команду часу в оболонці, time ./myappя отримую такий висновок:

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

Однак, коли я запускаю команду, \time -f %e ./myappя втрачаю точність і отримую:

2.01s

Якщо я використовую %Eкоманду, я так само втрачаю точність. Як я можу змінити його знову, щоб мати більш точну точку, але все ж виводиться лише секунди?

Я грунтувався на своєму дослідженні в цій команді Linux / Unix: час і на цьому питанні

Відповіді:


21

Я припускаю, що ви розумієте, що обидві ці команди викликають іншу версію часу, правда?

вбудована версія bash

% time

Час GNU ака. / usr / bin / час

% \time

Вбудовану timeкоманду, яку bashможна прочитати тут:

% 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/timeяк правило, корисніше, ніж вбудований.

Що стосується вашої проблеми з точністю, вона розглядається тут у цій суті github :

Чому час bash більш точний, ніж час GNU?

Вбудований командний час bash дає мілісекундну точність виконання, а час GNU (як правило, / usr / bin / time) дає точність в секундах. Система виклику time (2) дає час у тактових часах, а 100 - = 1 секунда (зазвичай), тому точність подібна до часу GNU. Який час використання башти, щоб він був більш точним?

Час Bash внутрішньо використовує getrusage (), а GNU - час (). getrusage () набагато точніший через мікросекундну роздільну здатність.

Ви можете бачити центрисекунди з наступного прикладу ( див. 5-й рядок виводу ):

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

Більшу роздільну здатність можна мати за допомогою timeкоманди bash, як так, і ви можете керувати роздільною здатністю:

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

З посібника Bash щодо змінних :

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.

так, я вже все це знав. Тож я можу зробити висновок, що те, що я хочу, неможливо? Чи є спосіб скористатися версією bash time і отримати лише реальний секундний час з 3 цифрами?
Flame_Phoenix

Дивіться моє оновлення, ви можете керувати командою time bash за допомогою змінної TIMEFORMAT. Це те, що ви шукаєте?
slm

Так, спасибі! Мені все ж цікаво, як я додаю це до файлу? Я намагаюся використовувати% TIMEFORMAT = '% 3R'; час (сон .22222) >> bla.txt, але він не працює: S Як би там не було, вибрано. Я б хотів, щоб я міг тобі дати карму ++, але у мене немає 15-карми -.- '
Flame_Phoenix

2
TIMEFORMAT = '% 3R'; час (сон .22222) 2 >> myFile.txt ЗАРАЗ!
Flame_Phoenix

Давно користувач обох і не знав про це TIMEFORMAT, я завжди використовував sed для видобутку реального часу. Спасибі! "Через мікросекундну роздільну здатність". Висловлюють мої сподівання, що TIMEFORMAT=%6Rце спрацює, але, схоже, цифра точності може бути лише 0-3.
mxmlnkn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.