Повысить точность% e с помощью команды оболочки / usr / bin / time

19

Когда я запускаю команду времени в оболочке, time ./myappя получаю вывод, подобный следующему:

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

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

2.01s

Если я использую %Eкоманду, я также теряю точность таким же образом. Как мне изменить его, чтобы он был более точным, но при этом выводились только секунды?

Я основал свое исследование на этой Linux / Unix Command: время и на этом вопросе

Flame_Phoenix
источник

Ответы:

21

Я полагаю, вы понимаете, что обе эти команды вызывают разные версии времени, верно?

встроенная версия Bash

% time

Время GNU ака. / USR / бен / время

% \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) дает точность в несколько секунд. Системный вызов times (2) дает время в тактах, а 100 тактов = 1 секунда (обычно), поэтому точность равна времени GNU. Что использует время bash, чтобы оно было более точным?

Время Bash внутренне использует getrusage (), а время GNU использует times (). 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

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

# 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.
SLM
источник
да, я уже все это знал. Таким образом, я могу сделать вывод, что то, что я хочу, невозможно? Есть ли способ использовать версию bash time и получить только реальное время с 3 цифрами?
Flame_Phoenix
Смотрите мое обновление, вы можете управлять командой времени 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