コマンドの実行にかかる時間をどのように計算しますか? [コピー]

コマンドの実行にかかる時間をどのように計算しますか? [コピー]

実行中のプロセスを完了するのにかかる時間をどのように知ることができますか?

例:

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

^この例の解像度は1秒だけです。

すべてのエンクロージャが許可されます。

答え1

使用time:

$ time somecommand --with=somearguments

timeコマンドラインの残りの部分(この場合somecommand --with=somearguments)が実行され、コマンドが完了すると経過時間が印刷されます。

出力例:

$ time somecommand --with=somearguments
...
... (output of somecommand)
...
real    0m5,020s
user    0m0,010s
sys     0m0,010s

通常必要な情報はですreal。この例では、コマンドの実行に約5秒かかります。その他の番号の詳細はこちらからご覧いただけます。https://stackoverflow.com/questions/556405/what-do-real-user-and-sys-mean-in-the-output-of-time1


上記の出力例は、bash 組み込みコマンドからのものです。timeほとんどのシェルに組み込まれたコマンドです。システムもありますtime。出力形式が異なりますが、それ以外は基本的にシェル組み込み関数と同じように動作します。

システム・コマンドを使用するには、次のようにします。

$ /usr/bin/time somecommand --what=islove

または

$ env time somecommand --baby=donthurtme

詳細はありますが、これはこのQ&Aの範囲外です。

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

$ env time somecommand --donthurtme=nomore
...
... (output of somecommand)
...
0.00user 0.01system 0:06.02elapsed 0%CPU (0avgtext+0avgdata 3656maxresident)k
0inputs+0outputs (0major+1089minor)pagefaults 0swaps

通常必要な情報はですelapsed。この例では、コマンドは約6秒かかります。他の数字が何を意味するのかについての良い説明は、インターネットで見つかりませんでした。マンページを読む必要があります:http://man7.org/linux/man-pages/man1/time.1.html

シェル組み込みコマンドとシステムコマンドの違いについて詳しくは、こちらをご覧ください。組み込みコマンドと非組み込みコマンドの違いは何ですか?

システムコマンドを呼び出す方法の詳細については、ここで確認できます。フルパスを指定せずに、組み込み Bash の代わりにシステムコマンドを使用します。


システム時間出力がより柔軟になりました。以下はいくつかのデモです。

システムの出力を変更できますtime。たとえば、-pシェル組み込みのような出力を得るには、次のようにしますtime

$ /usr/bin/time -p somecommand --what=isyourname
...
real 0:06.02
user 0.00
sys 0.01

または、-f以下を使用して独自の形式を作成します。

$ /usr/bin/time -f %E somecommand --what=isyourquest
...
0:06.02

%E「過去」部分です。一般的に最も興味のある部分です。

time完全性のために、次の変数を変更してbashの組み込み出力形式を変更することもできますTIMEFORMAT。追加情報:https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html#index-TIMEFORMAT


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

観測コマンドを実演するには、次のようにしますhellostdoutstderr

#!/bin/sh
sleep 0.5
echo "hello out"
echo "hello err" >&2

通貨例:

 $ ./hellostdoutstderr 
hello out
hello err

stdoutとstderrを別々にキャプチャ

$ ./hellostdoutstderr >stdoutfile 2>stderrfile

$ cat stdoutfile
hello out

$ cat stderrfile
hello err

システムはtimestderrとして印刷されるため、stderrリダイレクトでキャプチャできます。

$ /usr/bin/time ./hellostdoutstderr >stdoutfile 2>stderrfile

$ cat stdoutfile
hello out

$ cat stderrfile
hello err
0.00user 0.00system 0:00.50elapsed 1%CPU (0avgtext+0avgdata 3672maxresident)k
0inputs+16outputs (0major+311minor)pagefaults 0swaps

time別々のファイルとして印刷するようにシステムに指示できます。

$ /usr/bin/time -o timeoutfile ./hellostdoutstderr >stdoutfile 2>stderrfile

$ cat stdoutfile
hello out

$ cat stderrfile
hello err

$ cat timeoutfile
0.00user 0.00system 0:00.50elapsed 1%CPU (0avgtext+0avgdata 3676maxresident)k
0inputs+16outputs (0major+309minor)pagefaults 0swaps

bash 組み込み機能は、timestdout と stderr がリダイレクトされても常に端末に印刷されます。これは組み込みであり、必要なすべての操作を実行できるためです(シェルから)。

$ time ./hellostdoutstderr >stdoutfile 2>stderrfile

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

この例では、stdoutとstderrの両方がファイルにリダイレクトされます。しかし、bash組み込みコマンドはtimeまだ端末に印刷されます。

いくつかのトリックを使用して、bashの組み込み機能の出力をキャプチャすることはまだ可能です。しかし、システムコマンドを使用する方が簡単な場合は、なぜbashと戦うのですか?必要に応じて、以下の追加情報を確認してください。https://www.cyberciti.biz/faq/unix-linux-time-command-examples-usage-syntax/


より複雑なコマンドの時間を測定するには、いくつかのオプションがあります。

両方のコマンドを順番に時間を測定したい場合

$ time { command1 ; command2 ; }

パイプにも最適

$ time { command1 | command2 ; }

より複雑な内容については

$ time sh -c ' complex command chain '

しかし、引用文やその他の不満を注意してください。コマンドをスクリプトに入れてスクリプト時間を測定する方が良いでしょう。

$ time ./script.sh

重要な要約:timeコマンドの前に追加してください。スクリプト内で時間を測定するにはを使用します/usr/bin/time

関連情報