スクリプトのある時点で次のことを実行したい:
start_time=date
そして1つまたは複数のプロセスが実行された後のこれ:
end_time=date
そしてこれを行います:
elapsed=$end_time-$start_time echo "Total of $elapsed seconds elapsed for process"
これを行うにはどうすればよいですか?
コメント
-
/usr/bin/time your_script
… - 関連: stackoverflow.com/q/8903239/6843677
回答
エポックからの時間を使用して、スクリプト内の期間を簡単に識別します
man date %s seconds since 1970-01-01 00:00:00 UTC %N nanoseconds (000000000..999999999)
。
start_time="$(date -u +%s)" sleep 5 end_time="$(date -u +%s)" elapsed="$(($end_time-$start_time))" echo "Total of $elapsed seconds elapsed for process" Total of 5 seconds elapsed for process
Bashは浮動小数点数をサポートしていないため、bcなどの外部ツールを使用して次のような時間を比較する必要があります。 1475705058.042270582-1475705053.040524971
start_time="$(date -u +%s.%N)" sleep 5 end_time="$(date -u +%s.%N)" elapsed="$(bc <<<"$end_time-$start_time")" echo "Total of $elapsed seconds elapsed for process" Total of 5.001884264 seconds elapsed for process
コメント
回答
bashには組み込みタイマー変数
start=$SECONDS # do stuff end=$SECONDS duration=$(( end - start )) echo "stuff took $duration seconds to complete"
コメント
- または
SECONDS=0; ...; echo "$SECONDS"
。ただし、そのバグには注意してください。
回答
@jasonwryanはすでにそれを提案していますが、スクリプトの時間を計りたいときの頼みの綱でもあるので、答えとしてそれを投げます。 myscript の時間を計るには、単に次のように使用します。
time myscript
コメント
- 時々これを試しますが、これは必要な場合に適していますスクリプトのサブセクションを分離または時間指定します。
- これは、スクリプト自体の中で導出された経過時間を使用する場合、たとえば、スクリプトが1秒あたりに処理できた単位数を計算する場合には役立ちません。 。
回答
ソリューション。ただし、@ Miataには.%N
が含まれていますが、date
の実行にコストがかかる場合、ナノ秒でどのようなメリットが得られるかわかりません。サブシェルのコマンド。したがって、実際には、date +%s
で十分です。もう1つ注意すべき点は、date +%s
エポックは1970-01-0100:00:00UTCです。つまり、時間には絶対的なエポックがあり、シェルスクリプトのさまざまなインスタンス間またはさまざまなマシン間で時間測定値を共有できます。
(( start=$(date +%s) )) # 1604026743 # ... some activity that lasts for, say, 24 seconds (( end=$(date -u +%s) )) # 1604026767 (( duration=end-start )) # 24
@glennjackmanが好きです ” SECONDS
bash組み込み変数を参照しているため、回答します。ここで注意すべきことは、エポックはプロセスが開始された時刻です。したがって、この手法を使用できるのは、そのスクリプト内で発生することの時間を測定します。
(( start=SECONDS )) # 10 # ... some activity that lasts for, say, 24 seconds (( end=SECONDS )) # 34 (( duration=end-start )) # 24
もう1つは、すべての割り当てを(( ))
コマンド。つまり、次のように書き換えることができます。
cmd=$(( some_expression ))
as
(( cmd=some_expression ))
これを行うことで、$
シンボルの発生を最小限に抑えることができます。
date '+%s.%N'
を試してくださいdate -u
を使用してdateを呼び出す必要があります。 この回答をお読みくださいelapsed=$(dc -e "$end_time $start_time - p")