スクリプトの完了時間を表示したいと思います。
私が現在していることは-
#!/bin/bash
date ## echo the date at start
# the script contents
date ## echo the date at end
これは、スクリプトの開始時と終了時を示しています。プロセッサー時間/入出力時間などのようなきめ細かい出力を表示することは可能でしょうか?
スクリプトの完了時間を表示したいと思います。
私が現在していることは-
#!/bin/bash
date ## echo the date at start
# the script contents
date ## echo the date at end
これは、スクリプトの開始時と終了時を示しています。プロセッサー時間/入出力時間などのようなきめ細かい出力を表示することは可能でしょうか?
回答:
time
スクリプトを呼び出すときに使用します。
time yourscript.sh
time $( ... ) >> out.txt
time (command1 && command2)
場合はtime
オプションではありません、
start=`date +%s`
stuff
end=`date +%s`
runtime=$((end-start))
date
たとえば、まだ2回呼び出しているので、実際にはせいぜいミリ秒の精度しか得られない可能性があります)、を使用してみてくださいdate +%s.%N
。(%N
全体の秒からナノ秒です。)
date +%s%N
、など多くの可能なものを使用bc
jwchewが示唆のような二つの値から実際のランタイムを計算します。それでも、このアプローチは最適な方法ではないと感じています。time
上記の理由により、利用可能な場合はかなり優れています。
bc
してから、この操作を行います。runtime=$( echo "$end - $start" | bc -l )
echo "Duration: $((($(date +%s)-$start)/60)) minutes
times
スクリプトを終了するときに引数なしで呼び出すだけです。
ではksh
またはzsh
、あなたも使用することができますtime
代わりに。ではzsh
、ユーザーとシステムの CPU時間time
に加えて、ウォールクロック時間も提供されます。
スクリプトの終了ステータスを保持するには、次のようにします。
ret=$?; times; exit "$ret"
または、次の場所にトラップを追加することもできますEXIT
。
trap times EXIT
これにより、シェルが終了するたびに時間が呼び出され、終了ステータスが保持されます。
$ bash -c 'trap times EXIT; : {1..1000000}'
0m0.932s 0m0.028s
0m0.000s 0m0.000s
$ zsh -c 'trap time EXIT; : {1..1000000}'
shell 0.67s user 0.01s system 100% cpu 0.677 total
children 0.00s user 0.00s system 0% cpu 0.677 total
また、すべてのことに注意してくださいbash
、ksh
とzsh
持って$SECONDS
自動的秒ごとにインクリメントます特殊変数を。zsh
およびの両方でksh93
、その変数を浮動小数点(withでtypeset -F SECONDS
)にして、精度を高めることもできます。これは実時間であり、CPU時間ではありません。
time
前に示したアプローチに近いと思います。-- timeit
ここでは、MATLABコードで示されているアプローチが役立つと思います。
times
は壁の時間を与えないことがわかりましたよね?たとえば、bash -c 'trap times EXIT;sleep 2'
私は時流に少し遅れていますが、他の人が検索を通じてこのスレッドにつまずく場合に備えて、(1秒未満の精度で)私のソリューションを投稿したかったです。出力は、日、時間、分、最後に秒の形式です。
res1=$(date +%s.%N)
# do stuff in here
res2=$(date +%s.%N)
dt=$(echo "$res2 - $res1" | bc)
dd=$(echo "$dt/86400" | bc)
dt2=$(echo "$dt-86400*$dd" | bc)
dh=$(echo "$dt2/3600" | bc)
dt3=$(echo "$dt2-3600*$dh" | bc)
dm=$(echo "$dt3/60" | bc)
ds=$(echo "$dt3-60*$dm" | bc)
printf "Total runtime: %d:%02d:%02d:%02.4f\n" $dd $dh $dm $ds
誰かがこれが役に立つことを願っています!
date
は1秒未満の精度をサポートせずN
、タイムスタンプにリテラル「」を追加するだけであることに注意してください。
dt2=$(echo "$dt%86400" | bc)
。ただ言って...ところで私はフォームdt2=$(bc <<< "${dt}%86400")
が好きですが、それは完全に個人的なものです。
私の方法bash
:
# Reset BASH time counter
SECONDS=0
#
# do stuff
#
ELAPSED="Elapsed: $(($SECONDS / 3600))hrs $((($SECONDS / 60) % 60))min $(($SECONDS % 60))sec"
#!/bin/bash
start=$(date +%s.%N)
# HERE BE CODE
end=$(date +%s.%N)
runtime=$(python -c "print(${end} - ${start})")
echo "Runtime was $runtime"
はい、これはPythonを呼び出しますが、それと一緒に暮らすことができれば、これは非常に優れた簡潔なソリューションです。
python
コマンドをサブシェルで実行し、その出力を読み取るには、ほとんどの現在のシステムで数百万ナノ秒かかることに注意してください。実行中も同じですdate
。
この質問はかなり古いですが、私のお気に入りのやり方を見つけようとすると、このスレッドが高くなりました...
perf stat -r 10 -B sleep 1
「perf」は「tools / perf」の下のカーネルに含まれるパフォーマンス分析ツールであり、多くの場合、個別のパッケージとしてインストールできます(CentOSの「perf」とDebian / Ubuntuの「linux-tools」)。 Linux Kernal perf Wikiには、さらに多くの情報があります。
「perf stat」を実行すると、最後の平均実行時間など、かなりの詳細が表示されます。
1.002248382 seconds time elapsed ( +- 0.01% )
perf
?
perf stat
現在、「統計情報を収集する権限がない可能性があります」と文句を言います。でコマンドを実行しない限りsudo
、ターゲットマシンを完全に所有していないすべてのシナリオで役に立たなくなります。
アレックスの答えのバリエーションを次に示します。数分と数秒しか気にしませんが、フォーマットを変えたいと思いました。だから私はこれをやった:
start=$(date +%s)
end=$(date +%s)
runtime=$(python -c "print '%u:%02u' % ((${end} - ${start})/60, (${end} - ${start})%60)")
#!/bin/csh
#PBS -q glean
#PBS -l nodes=1:ppn=1
#PBS -l walltime=10:00:00
#PBS -o a.log
#PBS -e a.err
#PBS -V
#PBS -M shihcheng.guo@gmail.com
#PBS -m abe
#PBS -A k4zhang-group
START=$(date +%s)
for i in {1..1000000}
do
echo 1
done
END=$(date +%s)
DIFF=$(echo "$END - $START" | bc)
echo "It takes DIFF=$DIFF seconds to complete this task..."
date
、スクリプトの前後に使用し、それらの違いを出力する既に与えられた他の回答とはどう違うのですか?
bash のみを使用すると、シェルスクリプトの一部の期間(またはスクリプト全体の経過時間)を測定および計算することもできます。
start=$SECONDS
... # do time consuming stuff
end=$SECONDS
差を印刷することができます:
echo "duration: $((end-start)) seconds."
増分期間のみが必要な場合:
echo "duration: $((SECONDS-start)) seconds elapsed.."
期間を変数に保存することもできます。
let diff=end-start
に基づくタイミング関数はSECONDS
、第2レベルの粒度のみに制限され、外部コマンドを使用しません。
time_it() {
local start=$SECONDS ts ec
printf -v ts '%(%Y-%m-%d_%H:%M:%S)T' -1
printf '%s\n' "$ts Starting $*"
"$@"; ec=$?
printf -v ts '%(%Y-%m-%d_%H:%M:%S)T' -1
printf '%s\n' "$ts Finished $*; elapsed = $((SECONDS-start)) seconds"
# make sure to return the exit code of the command so that the caller can use it
return "$ec"
}
例えば:
time_it sleep 5
与える
2019-03-30_17:24:37 Starting sleep 5 2019-03-30_17:24:42 Finished
sleep 5; elapsed = 5 seconds