Linuxシェルスクリプトで操作にかかる時間を調べたいと思います。これどうやってするの?
他の人が示唆しているように、timeコマンドを使用することは良い考えです。
別のオプションは、マジックの組み込み変数$ SECONDSを使用することです。これには、スクリプトの実行が開始されてからの秒数が含まれます。あなたは言うことができます:
START_TIME=$SECONDS
dosomething
ELAPSED_TIME=$(($SECONDS - $START_TIME))
これはbash固有のものだと思いますが、Linuxを使用しているので、bashを使用していると思います。
time
コマンドを使用します。 time ls /bin
。
次の例を試してください:
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
答えの多くは$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."
経過時間をミリ秒単位で検索するスクリプトを次に示します。 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
エラーを受け取る私のような人を助けるためだけに:
arithmetic expression: expecting primary: "-"
次で始まるシェルスクリプトを確認します。
#!/bin/bash
乾杯!
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
出力:
cmd sleep 1
time 1.00
cmd sleep 2
time 2.00
cmd sleep 3
time 3.00
説明:
--output
:ファイルに時刻を出力します。
デフォルトでは、出力はstderrに送られるため、このオプションは、コマンドのstderrからタイミングを分離するために重要です。
--append
:上書きする代わりにファイルに追加します。
これにより、ベンチマーク出力全体を単一のファイルに集中できます。