私はいくつかの異なる条件下でLinuxシェルで何かを実行したいと思います、そしてそれぞれの実行の実行時間を出力することができます。
私はこれをするPerlまたはpythonスクリプトを書くことができることを知っています、しかし私がシェルでそれをすることができる方法はありますか? (それはたまたまbashです)
組み込みのtime
キーワードを使用します。
$ help time time:time [-p] PIPELINE PIPELINEを実行して、リアルタイムの要約、ユーザーCPU時間、[.____。 リターンステータスは、PIPELINEのリターンステータスです。 `-p 'オプション はタイミングの要約をわずかに異なるフォーマットで表示します。これはTIMEFORMAT変数の値を出力フォーマットとして使用する 。
例:
$ time sleep 2
実際0m2.009s ユーザー0m0.000s sys 0m0.004s
#!/bin/bash
START=$(date +%s)
# do something
# start your script work here
ls -R /etc > /tmp/x
rm -f /tmp/x
# your logic ends here
END=$(date +%s)
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"
行ごとのデルタ測定の場合は、 gnomon を試してください。
Moreutilsのtsのようなコマンドラインユーティリティで、タイムスタンプ情報を他のコマンドの標準出力の前に付加します。長時間の処理の履歴記録が必要な場合は、長時間の処理に役立ちます。
また、--high
および/または--medium
オプションを使用して長さのしきい値を秒単位で指定できます。これを超えると、gnomonはタイムスタンプを赤または黄色で強調表示します。そして他にもいくつかできることがあります。
もっと精度が必要な場合は、date
と一緒に%N
を使用します($(())
は整数しか処理しないので、diffにはbc
を使用します)。
これを行う方法は次のとおりです。
start=$(date +%s.%N)
# do some stuff here
dur=$(echo "$(date +%s.%N) - $start" | bc)
printf "Execution time: %.6f seconds" $dur
例:
start=$(date +%s.%N); \
sleep 0.1s; \
dur=$(echo "$(date +%s.%N) - $start" | bc); \
printf "Execution time: %.6f seconds\n" $dur
結果:
Execution time: 0.104623 seconds
後で時間を使って計算する場合は、-f
の/usr/bin/time
オプションを使用して時間を節約する code を出力する方法を学びます。これは私が最近クラス全体の生徒のプログラムの実行時間を取得しソートするために使ったコードです。
fmt="run { date = '$(date)', user = '$who', test = '$test', Host = '$(hostname)', times = { user = %U, system = %S, elapsed = %e } }"
/usr/bin/time -f "$fmt" -o $timefile command args...
後ですべての$timefile
ファイルを連結し、その出力を Luaインタプリタ にパイプ処理しました。 Pythonやbash、あるいはあなたの好きな構文がなんであれ、同じことができます。私はこのテクニックが好きです。
秒単位の精度が必要な場合は、シェルが実行されている秒数をカウントする組み込みの$SECONDS
変数を使用できます。
while true; do
start=$SECONDS
some_long_running_command
duration=$(( SECONDS - start ))
echo "This run took $duration seconds"
if some_condition; then break; fi
done
time
およびサブシェル()
を使用できます。
time (
for (( i=1; i<10000; i++ )); do
echo 1 >/dev/null
done
)
または同じシェル{}
内で:
time {
for (( i=1; i<10000; i++ )); do
echo 1 >/dev/null
done
}
方法は
$ > g++ -lpthread perform.c -o per
$ > time ./per
出力は>>
real 0m0.014s
user 0m0.010s
sys 0m0.002s
おそらく単純な方法(ユーザーのさまざまなニーズを満たしていない可能性があります)は、Shell Prompt.itを使用することです。これは、場合によっては便利な単純なソリューションです。以下の例のようにbashプロンプト機能を使用することができます。
pS1のエクスポート= '[\ t\u @\h]\$'
上記のコマンドは、シェルプロンプトを次のように変更します。
[HH:MM:SSのユーザ名@ hostname] $
シェルプロンプトに戻るコマンドを実行する(またはEnterキーを押す)たびに、プロンプトには現在の時刻が表示されます。
メモ:
1)次のコマンドを入力する前にしばらく待った場合は、この時間を考慮する必要があります。シェルプロンプトに表示されるのは、コマンドを入力したときではなく、シェルプロンプトが表示されたときのタイムスタンプです。次のコマンドの準備ができる前に、Enterキーを押して新しいタイムスタンプ付きの新しいプロンプトを表示することを選択するユーザーもいます。
2)bashプロンプトを変更するために使用できる他の利用可能なオプションや修飾子があります。詳しくは(man bash)を参照してください。詳細.