web-dev-qa-db-ja.com

シェルでプログラムの実行時間を取得する

私はいくつかの異なる条件下でLinuxシェルで何かを実行したいと思います、そしてそれぞれの実行の実行時間を出力することができます。

私はこれをするPerlまたはpythonスクリプトを書くことができることを知っています、しかし私がシェルでそれをすることができる方法はありますか? (それはたまたまbashです)

375
ʞɔıu

組み込みのtimeキーワードを使用します。

 $ help time 
 time:time [-p] PIPELINE 
 PIPELINEを実行して、リアルタイムの要約、ユーザーCPU時間、[.____。 
リターンステータスは、PIPELINEのリターンステータスです。 `-p 'オプション
はタイミングの要約をわずかに異なるフォーマットで表示します。これはTIMEFORMAT変数の値を出力フォーマットとして使用する
。

例:

$ time sleep 2
実際0m2.009s 
ユーザー0m0.000s 
 sys 0m0.004s 
498
Robert Gamble
#!/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"
76
David

行ごとのデルタ測定の場合は、 gnomon を試してください。

Moreutilsのtsのようなコマンドラインユーティリティで、タイムスタンプ情報を他のコマンドの標準出力の前に付加します。長時間の処理の履歴記録が必要な場合は、長時間の処理に役立ちます。

また、--highおよび/または--mediumオプションを使用して長さのしきい値を秒単位で指定できます。これを超えると、gnomonはタイムスタンプを赤または黄色で強調表示します。そして他にもいくつかできることがあります。

example

39
Adriano Resende

もっと精度が必要な場合は、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
18
Benoit Duffez

後で時間を使って計算する場合は、-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、あるいはあなたの好きな構文がなんであれ、同じことができます。私はこのテクニックが好きです。

13
Norman Ramsey

秒単位の精度が必要な場合は、シェルが実行されている秒数をカウントする組み込みの$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
12
glenn jackman

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
}
8
Eduardo Cuomo

方法は

$ > g++ -lpthread perform.c -o per
$ > time ./per

出力は>>

real    0m0.014s
user    0m0.010s
sys     0m0.002s
2
Robel Sharma

おそらく単純な方法(ユーザーのさまざまなニーズを満たしていない可能性があります)は、Shell Prompt.itを使用することです。これは、場合によっては便利な単純なソリューションです。以下の例のようにbashプロンプト機能を使用することができます。

pS1のエクスポート= '[\ t\u @\h]\$' 

上記のコマンドは、シェルプロンプトを次のように変更します。

[HH:MM:SSのユーザ名@ hostname] $ 

シェルプロンプトに戻るコマンドを実行する(またはEnterキーを押す)たびに、プロンプトには現在の時刻が表示されます。

メモ:
1)次のコマンドを入力する前にしばらく待った場合は、この時間を考慮する必要があります。シェルプロンプトに表示されるのは、コマンドを入力したときではなく、シェルプロンプトが表示されたときのタイムスタンプです。次のコマンドの準備ができる前に、Enterキーを押して新しいタイムスタンプ付きの新しいプロンプトを表示することを選択するユーザーもいます。
2)bashプロンプトを変更するために使用できる他の利用可能なオプションや修飾子があります。詳しくは(man bash)を参照してください。詳細.

0
tstorym