使用 /usr/bin/time shell 命令提高 %e 精度

Fla*_*nix 19 shell scripting time

当我在 shell 中运行 time 命令时,time ./myapp我得到如下输出:

real    0m0.668s
user    0m0.112s
sys     0m0.028s
Run Code Online (Sandbox Code Playgroud)

但是,当我运行命令时,\time -f %e ./myapp我失去了精度,我得到:

2.01s
Run Code Online (Sandbox Code Playgroud)

如果我使用该%E命令,我也会以同样的方式失去精度。如何将其更改为再次具有更高的精度,但仍然只输出秒数?

我的研究基于这个Linux / Unix Command: time and on this question

slm*_*slm 22

我假设您明白这两个命令都在调用不同版本的时间,对吗?

bash 的内置版本

% time
Run Code Online (Sandbox Code Playgroud)

GNU 时间又名。/usr/bin/时间

% \time
Run Code Online (Sandbox Code Playgroud)

内置time命令 tobash可以在这里阅读:

% 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.
Run Code Online (Sandbox Code Playgroud)

GNU time, /usr/bin/time, 通常比内置的更有用。

至于您的精度问题,它在此github gist 中有所介绍,特别是:

为什么 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
Run Code Online (Sandbox Code Playgroud)

使用 bash 的time命令可以获得更多分辨率,您可以控制分辨率:

# 3 places 
% TIMEFORMAT='%3R'; time ( sleep .22222 )
0.224
Run Code Online (Sandbox Code Playgroud)

来自关于变量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.
Run Code Online (Sandbox Code Playgroud)

  • 时间格式='%3R'; time ( sleep .22222 ) 2>>myFile.txt 明白了! (2认同)