web-dev-qa-db-ja.com

コマンドの実行にかかった時間をどのように計りますか?

実行中のプロセスが完了するまでにかかった時間はどのようにわかりますか?

例:

 date; dd bs=1m if=/foo of=bar; date

^この例では、1秒の解像度しかありません。

任意のシェルが受け入れ可能です。

34
spuder

timeを使用:

$ time longrunningcommand --takeyourtime

timeは、コマンドラインの残りの部分をコマンドとして実行し(この例ではlongrunningcommand --takeyourtime)、コマンドが完了すると、経過時間を出力します。

別の例:time foo --barfoo --barを実行し、終了するまで待機してから経過時間を出力します。

timeは、ほとんどのシェルの組み込みコマンドです。ビルトインシェルとシステムコマンドの違いは、主に出力の形式です。違いの詳細については、以下を参照してください。

システムを使用する場合はtimeを次のように実行します。

$ /usr/bin/time longrunningcommand --getsomecoffee

またはこのように:

$ \time longrunningcommand --callmom
$ command time longrunningcommand --callmom

バックスラッシュはbashや他のいくつかのシェルで機能します。 commandはほとんどのシェルで動作します。


より複雑な例

longrunningcommand

#!/bin/sh

echosleep() {
  seq $1 | while read tick; do
    echo $tick
    sleep 1
  done
  echo done
}

case $1 in
  --takeyourtime) echosleep 4 ;;
  --getsomecoffee) echosleep 5 ;;
  --callmom) echosleep 6 ;;
  *) echo wat ;;
esac

呼び出し例:

$ ./longrunningcommand --takeyourtime
1
2
3
4
done

(出力の各ライン間に遅延あり)

bash組み込み関数timeを使用した呼び出し例:

$ time ./longrunningcommand --getsomecoffee
1
2
3
4
5
done

real    0m5,020s
user    0m0,010s
sys 0m0,010s

興味深い情報はreal 0m5,020sです。他の数値の詳細については、こちらをご覧ください: https://stackoverflow.com/questions/556405/what-do-real-user-and-sys-mean-in-the-output-of-time1

システムtimeを使用した呼び出し例:

$ \time ./longrunningcommand --callmom
1
2
3
4
5
6
done
0.00user 0.01system 0:06.02elapsed 0%CPU (0avgtext+0avgdata 3656maxresident)k
0inputs+0outputs (0major+1089minor)pagefaults 0swaps

興味深い情報は0:06.02elapsedです。他の数値の意味については、timeのmanページをお読みください: http://man7.org/linux/man-pages/man1/time.1.html

システムの出力を変更できますtime。観察する:

$ \time sleep 0.5
0.00user 0.00system 0:00.50elapsed 0%CPU (0avgtext+0avgdata 2376maxresident)k
0inputs+0outputs (0major+81minor)pagefaults 0swaps
$ \time -p sleep 0.5
real 0.50
user 0.00
sys 0.00
$ \time -f %E sleep 0.5
0:00.50

出力をリダイレクトまたはキャプチャする方法

デモンストレーションの観察コマンドhellostdoutstderr

#!/bin/sh
sleep 0.5
echo stdout
echo stderr >&2

呼び出し例:

 $ ./hellostdoutstderr 
stdout
stderr
$ ./hellostdoutstderr >stdout 2>stderr
$ cat stdout
stdout
$ cat stderr
stderr

bashビルトインtimeは、組み込みであり、シェルで好きなように実行できるため、stdoutとstderrがリダイレクトされた場合でもターミナルを出力します。

$ time ./hellostdoutstderr >stdout 2>stderr

real    0m0,511s
user    0m0,005s
sys 0m0,006s

この出力をまだリダイレクトするには、ここを読んでください: https://stackoverflow.com/questions/18348593/how-can-i-output-from-usr-bin-time-to-a-file-at-the- right-location-within-exec

またはここ: https://www.cyberciti.biz/faq/unix-linux-time-command-examples-usage-syntax/

システムtimeは、必要に応じてstderrに出力します

$ \time ./hellostdoutstderr >stdout 2>stderr
$ cat stdout
stdout
$ cat stderr
stderr
0.00user 0.00system 0:00.50elapsed 1%CPU (0avgtext+0avgdata 3672maxresident)k
0inputs+16outputs (0major+311minor)pagefaults 0swaps

別のファイルに出力するようtimeに指示できます

$ \time -o timeout ./hellostdoutstderr >stdout 2>stderr
$ cat stderr
stderr
$ cat timeout 
0.00user 0.00system 0:00.50elapsed 1%CPU (0avgtext+0avgdata 3676maxresident)k
0inputs+16outputs (0major+309minor)pagefaults 0swaps
64
lesmana