時間コマンドを使用してコマンド実行の時間を計る方法
序章
コマンドまたはスクリプトの実行にかかった時間を知りたい場合があります。 開始時間と終了時間を追跡し、差を計算して期間を取得できます。 信頼できるストップウォッチアプリを入手して、その方法で追跡することもできます。 または、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コマンドを使用すると、追加のスクリプトを作成しなくても、コマンドの実行期間のタイミングにすばやくアクセスできます。