/usr/bin/time --format output elapsed time in milliseconds

27,030

Solution 1

One possibility is to use the date command:

ts=$(date +%s%N) ; my_command ; tt=$((($(date +%s%N) - $ts)/1000000)) ; echo "Time taken: $tt milliseconds"

%N should return nanoseconds, and 1 millisecond is 1000000 nanosecond, hence by division would return the time taken to execute my_command in milliseconds.

NOTE that the %N is not supported on all systems, but most of them.

Solution 2

For convenience I made devnull's answer into a script (I named it millisecond-time).

#!/bin/bash
ts=$(date +%s%N) ; $@ ; tt=$((($(date +%s%N) - $ts)/1000000)) ; echo "Time taken: $tt milliseconds"

I put the script in /usr/local/bin.
Gave it execute rights chmod +x /usr/local/bin/millisecond-time.
Now I can use it like this: millisecond-time my_command

P.s. This would be a comment if I had the rep'.

Solution 3

There are a couple of things getting confused in this thread.

Bash has a built-in time command which supports a TIMEFORMAT environment variable that will let you format the output. For details on this run man bash and search for TIMEFORMAT.

There is also a standard /usr/bin/time command-line utility which supports a TIME environment variable that will let you format the output (or you can use -f or --format on the command line). For details on this run man time and search for TIME.

If you want the number of seconds the command took to run you can either use the built-in bash command (which supports a maximum precision of three decimal places):

bash# export TIMEFORMAT="%3lR" 
bash# time find /etc > /dev/null
0m0.015s

Or you can use the command-line utility (which supports a maximum precision of two decimal places):

shell# export TIME="%E"
shell# /usr/bin/time find /opt/ > /dev/null
0:00.72

As mentioned above neither of these variables are used by anything else and are safe to change.

Share:
27,030
Preexo
Author by

Preexo

Updated on January 08, 2021

Comments

  • Preexo
    Preexo over 3 years

    I use the /usr/bin/time program to measure the time for a command. with the --format parameter i can format the output. e.g.

    /usr/bin/time -f "%e" ls
    

    is there a way to output a bigger accuracy of the elapsed seconds? or just output milliseconds, not seconds?

    In the manual of /usr/bin/time it only says something about seconds, but maybe there is a way and someone can help me... thanks!

    EDIT: I know about the bash command "time" which uses the format of the environment variable "TIMEFORMAT". sorry, but i don't wanna change that env-var... seems to risky to me, solution should be something that doesn't change the running system at all :)

  • Preexo
    Preexo almost 11 years
    excelent, accepted! didn't think of date, but that's good enough! To get from nanoseconds to milliseconds you have to divide by 1000000, though: ts=$(date +%s%N) ; sleep 1 ; tt=$((($(date +%s%N) - $ts)/1000000)) ; echo $tt
  • snodnipper
    snodnipper over 7 years
    For those on OSX without the required temporal resolution from date, one can substitute the native date with gdate. For example: brew install coreutils if necessary and then ts=$(gdate +%s%N) ; sleep 1 ; tt=$((($(gdate +%s%N) - $ts)/1000000)) ; echo $tt source
  • studog
    studog almost 6 years
    You can use %3N on systems that have %N to get just the milliseconds. See https://serverfault.com/a/588705/432437
  • Yuriy Nemtsov
    Yuriy Nemtsov over 5 years
    To allow my_command to have arguments, you may want to surround the provided command in quotes: "$@"