web-dev-qa-db-ja.com

シェルスクリプトで期間を秒単位で測定するにはどうすればよいですか?

Linuxシェルスクリプトで操作にかかる時間を調べたいと思います。これどうやってするの?

70
Zubair

他の人が示唆しているように、timeコマンドを使用することは良い考えです。

別のオプションは、マジックの組み込み変数$ SECONDSを使用することです。これには、スクリプトの実行が開始されてからの秒数が含まれます。あなたは言うことができます:

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

これはbash固有のものだと思いますが、Linuxを使用しているので、bashを使用していると思います。

103
Tom Anderson

timeコマンドを使用します。 time ls /bin

39
Keith

次の例を試してください:

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
34

答えの多くは$SECONDSが、その変数は実際には 彼らが認識しているよりもずっと良い

この変数に割り当てると、カウントは割り当てられた値にリセットされ、展開された値は、割り当てられた値に割り当て後の秒数を加えた値になります。

これは、スクリプトの最後でこの変数を直接照会して、経過時間を出力できることを意味します。

#!/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."
6
Tammer Saleh

経過時間をミリ秒単位で検索するスクリプトを次に示します。 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
5
user3300239

エラーを受け取る私のような人を助けるためだけに:

 arithmetic expression: expecting primary: "-"

次で始まるシェルスクリプトを確認します。

#!/bin/bash

乾杯!

3
rafa.ferreira

GNU time

私はGNU timeコマンド: https://www.gnu.org/software/time/ の大きな楽しみでもありますtime Bashビルトインと比較したいくつかの重要なオプション。

サンプル使用法:

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

出力:

1.00

説明:

  • env:Bashビルトインの代わりに/usr/bin/timeを見つける

  • --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アップストリーム

出力:

cmd sleep 1
time 1.00

cmd sleep 2
time 2.00

cmd sleep 3
time 3.00

説明:

  • --output:ファイルに時刻を出力します。

    デフォルトでは、出力はstderrに送られるため、このオプションは、コマンドのstderrからタイミングを分離するために重要です。

  • --append:上書きする代わりにファイルに追加します。

    これにより、ベンチマーク出力全体を単一のファイルに集中できます。