時間コマンドを使用してコマンド実行の時間を計る方法
序章
コマンドまたはスクリプトの実行にかかった時間を知りたい場合があります。 開始時間と終了時間を追跡し、差を計算して期間を取得できます。 信頼できるストップウォッチアプリを入手して、その方法で追跡することもできます。 または、time
コマンドを利用することで、すべての問題を回避できます。
コマンドラインには、追加のコードを自分で作成する必要をなくすのに役立つ、小さな単一目的のユーティリティがたくさんあります。 time
コマンドはそのようなコマンドの1つです。 time
コマンドは、システムの日付と時刻を提供するdate
コマンドとはまったく関係ありません。 代わりに、プログラムまたはスクリプトの実行時間を計測し、所要時間を示します。
このチュートリアルでは、time
コマンドを使用して、その出力を調べます。
このチュートリアルの例では(特に明記されていない限り)、LinuxのBashシェルに組み込まれているtime
を使用します。
インタラクティブターミナルを起動します!
ステップ1—タイミングコマンドの実行
コマンドの実行時間を計測するには、コマンドの前にtime
を付けます。
ただし、time
の実行方法は、オペレーティングシステムによって異なります。 time
は、bash
やzsh
などの一部のシェルの組み込みコマンドと、GNUtime
と呼ばれるスタンドアロンコマンドの両方として存在します。 ]シェルに組み込まれているtime
とは異なる引数があります。
次のコマンドを使用して、システムでtime
がどのように機能するかを確認します。
type -a time
次のような出力が表示されます。
Outputtime is a shell keyword time is /usr/bin/time
この場合、time
と呼ばれる組み込みのシェルコマンドと、/usr/bin/time
にインストールされているバージョンのtime
の両方があります。
代わりにtime
のGNUバージョンを使用する場合は、接頭辞としてバックスラッシュを付けることができます。
\time
そうしないと、シェルは代わりに組み込みバージョンを使用します。
注: fish
シェルは、time
の独自の実装を提供しません。 fish
を使用している場合は、GNUtime
コマンドがインストールされていることを確認する必要があります。
GNUバージョンにはより高度なフォーマットオプションがありますが、どちらの方法も同じ目的を果たします。
ファイルシステムのルート/
でtree
コマンドを使用して、タイミングプログラムの実行を調べてみましょう。これにより、すべてのファイルとディレクトリのビジュアルツリーが一覧表示されます。
tree
コマンドは、多くのシステムでデフォルトで常にインストールされるとは限りませんが、apt
を使用してUbuntuおよびDebianシステムにインストールできます。
sudo apt install tree
macOSでは、tree
をHomebrewと一緒にインストールできます。
brew install tree
tree
コマンドがインストールされたので、このコマンドを使用してシステム上のすべてのファイルを確認しますが、プレフィックスとしてtime
を付けて、所要時間を確認します。
time tree /
ファイル情報がスクロールして表示されます。 最終的に、それは停止し、かかった時間を表示します。
Output# The output of tree will scroll by here. 166590 directories, 1568127 files tree / 12.24s user 10.37s system 66% cpu 33.827 total
実行したコマンドtree /
は、time
コマンドによってもエコーバックされることに注意してください。 出力にはいくつかの情報が表示されますが、今のところ、total
と直前の番号に注目してください。
Outputtree / 12.24s user 10.37s system 66% cpu 33.827 total
これは、コマンドの実行にかかった時間(秒単位)です。
time
コマンドは、CTRL+C
でコマンドをキャンセルした場合にも機能します。 time tree /
をもう一度実行し、CTRL+C
をすばやく押すと、tree
コマンドのスクロールが停止し、time
の結果が表示されます。コマンドを停止する前に実行されていた時間。
ステップ2—リソース使用量を理解する
time
からの出力には、合計期間に加えて3つの値が含まれます。
Outputtree / 12.24s user 10.37s system 66% cpu 33.827 total
1つ目は、コマンドがユーザーモードで費やした合計時間(CPU秒単位)です。 それがuser
の後にある値です。
次の接尾辞はsystem
で、コマンドがシステムモードまたはカーネルモードで費やした時間(ここでもCPU秒単位)です。
最後に、cpu
という接尾辞が付いたコマンドに割り当てられたCPUのパーセンテージ。
user
とsystem
の時間の違いは、CPU使用率がアクセスレベルごとに分類されていることです。 コードがユーザーモードで実行される場合、ハードウェアや参照メモリに直接アクセスすることはできず、委任のためにシステムのAPIに依存する必要があります。 これは、ほとんどのコードがシステム上で実行される方法であり、その分離により、クラッシュは常に回復可能です。
一方、カーネルモードは、実行中のコードがシステムハードウェアに無制限にアクセスできる場合です。 このモードは、オペレーティングシステムの最も信頼できる機能のためにほとんど予約されています。 完全にアクセスできるため、カーネルモードでクラッシュすると、クラッシュがひどくなり、システムがダウンする傾向があります。
結論
このチュートリアルでは、time
コマンドを使用して、コマンドとスクリプトの実行にかかる時間とその時間がどこに行くかを確認しました。 シェルのtime
コマンドを使用すると、追加のスクリプトを作成しなくても、コマンドの実行期間のタイミングにすばやくアクセスできます。