如何在shell脚本中测量持续时间(以秒为单位)?

时间:2011-03-01 09:51:35

标签: shell timing

我希望了解Linux shell脚本中的操作需要多长时间。我怎么能这样做?

7 个答案:

答案 0 :(得分:97)

正如其他人所建议的,使用time命令是一个好主意。

另一种选择是使用魔术内置变量$ SECONDS,它包含自脚本开始执行以来的秒数。你可以说:

START_TIME=$SECONDS
dosomething
ELAPSED_TIME=$(($SECONDS - $START_TIME))

我认为这是特定于bash的,但是因为你在Linux上,我认为你正在使用bash。

答案 1 :(得分:39)

使用time命令。 time ls /bin

答案 2 :(得分:33)

请尝试以下示例:

START_TIME=$SECONDS
# do something
sleep 65

ELAPSED_TIME=$(($SECONDS - $START_TIME))

echo "$(($ELAPSED_TIME/60)) min $(($ELAPSED_TIME%60)) sec"    
#> 1 min 5 sec

答案 3 :(得分:4)

以下是查找经过的时间的脚本(以毫秒为单位)。将sleep 60行替换为您要执行的代码。

a=0
while [ $a -lt 10 ]
do
START_TIME=`echo $(($(date +%s%N)/1000000))`
sleep 3
END_TIME=`echo $(($(date +%s%N)/1000000))`
ELAPSED_TIME=$(($END_TIME - $START_TIME))
echo $ELAPSED_TIME
if [ $a -eq 10 ]
then
  break
fi
a=`expr $a + 1`
done

答案 4 :(得分:4)

许多答案都提到了$SECONDS,但该变量实际上是even better than they realize

  

分配给该变量会将计数重置为分配的值,并且扩展的值将成为分配的值加上分配以来的秒数。

这意味着您可以直接在脚本结尾直接查询此变量以打印经过的时间:

#!/usr/bin/env bash

# Do stuff...

echo "Script finished in $SECONDS seconds."

您还可以为较小的部分设置时间,例如:

#!/usr/bin/env bash

# Do stuff

SECONDS=0

# Do timed stuff...

echo "Timed stuff finished in $SECONDS seconds."

答案 5 :(得分:2)

只是为了帮助像我这样的人收到错误:

 arithmetic expression: expecting primary: "-"

检查以下开头的shellcript:

#!/bin/bash

干杯!

答案 6 :(得分:1)

GNU time

我也很喜欢GNU time命令:https://www.gnu.org/software/time/,与内置time的Bash相比,它提供了一些重要的选项。

样品用量:

env time --format '%e' --output time.log sleep 1

输出:

1.00

说明:

  • env:找到/usr/bin/time而不是内置的Bash

  • --format '%e':以秒为单位的打印时间,请参见man time

    这通常是基准测试时我想要的:一个数字而不是分钟+秒。

我经常使用的一个重要模式是:

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

输出:

cmd sleep 1
time 1.00

cmd sleep 2
time 2.00

cmd sleep 3
time 3.00

说明:

  • --output:将时间输出到文件。

    默认情况下,输出将输出到stderr,因此此选项对于将计时与命令的stderr分开很重要。

  • --append:附加到文件而不是覆盖。

    这使我可以将整个基准测试输出集中在一个文件中。