如何在shell script中获取一段操作的耗时
通常我们可以使用 time
命令来获取某个命令的执行时间
lujun9972:~/ $ time sleep 1 real 0m1.003s user 0m0.001s sys 0m0.003s
但是使用 time
统计耗时有几个缺陷:
一来,解析 time
命令的输出比较麻烦,因为它直接往 /dev/tty
中写信息的,而不是通过stdout或stderr来输出的,因此你无法简单的通过 $()
来捕获输出。
lujun9972:~/ $ t=$(time sleep 1) real 0m1.011s user 0m0.000s sys 0m0.005s lujun9972:~/ $ echo $a lujun9972:~/ $ t=$(time sleep 1 2>&1) real 0m1.004s user 0m0.001s sys 0m0.003s lujun9972:~/ $ echo $a
二来, time
只会统计某个命令的耗时情况,如果要统计多个命令的总耗时则会比较麻烦. 你可能要把这些操作封在一个子shell中
lujun9972:~/ $ time (sleep 1;sleep 1) real 0m2.010s user 0m0.004s sys 0m0.003s
然而,事实上Bash中提供了一个 SECONDS
变量,该变量记录了shell从启动开始到现在经过的秒钟数。
通过这个变量我们可以很方便地统计多个操作的总耗时了:
OLD=$SECONDS sleep 1 sleep 1 echo "总耗时:" $(($SECONDS - $OLD))
总耗时: 2
唯一美中不足的是,它的精度只能达到秒级,不过对于大多数情况应该也足够了。