20

When I run the time command in shell time ./myapp I get an output like the following:

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

However,when I run the command \time -f %e ./myapp I lose precision and I get:

2.01s

If I use the %E command I also lose precision in the same way. How do I change it to have more precision again, but still only have the seconds being outputted?

I based my research in this Linux / Unix Command: time and on this question

1 Answer 1

23

I'm assuming you understand that both these commands are calling a different version of time, right?

bash's built-in version

% time

GNU time aka. /usr/bin/time

% \time

The built-in time command to bash can be read up on here:

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

The GNU time, /usr/bin/time, is usually more useful than the built-in.

As to your precision problem it's covered here in this github gist, specifically:

Why is bash time more precise then GNU time?

The builtin bash command time gives milisecond precision of execution, and GNU time (usually /usr/bin/time) gives centisecond precision. The times(2) syscall gives times in clocks, and 100 clocks = 1 second (usually), so the precision is like GNU time. What is bash time using so that it is more precise?

Bash time internally uses getrusage() and GNU time uses times(). getrusage() is far more precise because of microsecond resolution.

You can see the centiseconds with the following example (see 5th line of output):

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

More resolution can be had using bash's time command like so & you can control the resolution:

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

From the Bash manual on variables:

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.
5
  • yes I already knew all of that. So I can conclude that what I want is impossible ? Is there a way to use the bash time version and only get the real secs time with 3 digits? Commented Mar 31, 2013 at 1:48
  • See my update, you can control bash's time command using the variable TIMEFORMAT. Is that what you're looking for?
    – slm
    Commented Mar 31, 2013 at 2:31
  • Yah, that's it, thanks! I am wondering though, how do I append that to a file? I am trying to use % TIMEFORMAT='%3R'; time ( sleep .22222 ) >> bla.txt but it's not working :S Anyway, selected. I wish I could give you karma++, but I don't have 15 karma -.-' Commented Mar 31, 2013 at 11:27
  • 2
    TIMEFORMAT='%3R'; time ( sleep .22222 ) 2>>myFile.txt GOt it ! Commented Mar 31, 2013 at 11:36
  • Long time user of both and didn't know about TIMEFORMAT, I always used sed to extract real time. Thanks! The "because of microsecond resolution." statement put my hopes up that TIMEFORMAT=%6R would work but it seems that the precision digit may only be 0-3.
    – mxmlnkn
    Commented Dec 14, 2019 at 12:43

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .