I wish to find out how long an operation takes in a Linux shell script. How can I do this?
GNU time
I'm also a big fun of the GNU time
command: https://www.gnu.org/software/time/ which offers some important options compared to the time
Bash built-in.
Sample usage:
env time --format '%e' --output time.log sleep 1
Output:
1.00
Explanation:
env
: to find /usr/bin/time
instead of the Bash built-in
--format '%e'
: print time in seconds, see man time
.
This is often what I want when benchmarking: a single number rather than minutes + seconds.
And an important pattern I often use is:
bench-cmd() (
logfile=time.log
echo "cmd $@" >> "$logfile"
printf 'time ' >> "$logfile"
bench_cmd="env time --append --format '%e' --output '$logfile' $@"
eval "$bench_cmd"
echo >> "$logfile"
)
rm -f time.log
bench-cmd sleep 1
bench-cmd sleep 2
bench-cmd sleep 3
cat time.log
GitHub upstream.
Output:
cmd sleep 1
time 1.00
cmd sleep 2
time 2.00
cmd sleep 3
time 3.00
Explanation:
--output
: output the time to a file.
By default, the output goes to stderr, so this option is important to separate the timing from the stderr of the command.
--append
: append to the file instead of overwriting.
This allows me to concentrate the entire benchmark output in a single file.