[Linux] timeコマンドの使い方 – コマンド実行時間の計測
time
コマンドは、指定したコマンドの実行時間を計測するために使用されます。
実行結果として、以下の3つの時間が表示されます:
- real: コマンドの開始から終了までの実際の経過時間(壁時計時間)。
- user: プロセスがユーザーモードで消費したCPU時間。
- sys: プロセスがカーネルモードで消費したCPU時間。
使い方は、time
の後に計測したいコマンドを入力するだけです。
例えば、time ls
と入力すると、ls
コマンドの実行時間が計測されます。
- timeコマンドの基本的な使い方
- 実行時間の3つの種類の解説
- 各種オプションの活用方法
- 応用例を通じた実践的な利用法
- 注意点を考慮した計測のポイント
timeコマンドとは
time
コマンドは、LinuxやUnix系のシステムでコマンドの実行時間を計測するためのツールです。
このコマンドを使用することで、特定のプログラムやスクリプトが実行されるのにかかる時間を簡単に測定できます。
計測結果は、実行時間やCPU時間など、さまざまな情報を提供します。
これにより、プログラムのパフォーマンスを評価したり、最適化のためのデータを収集したりすることが可能です。
timeコマンドの概要
time
コマンドは、指定したコマンドの実行にかかる時間を測定し、結果を表示します。
主に以下の情報を提供します。
時間の種類 | 説明 |
---|---|
real | 実際に経過した時間 |
user | ユーザーモードでのCPU時間 |
sys | カーネルモードでのCPU時間 |
この情報をもとに、プログラムの効率やボトルネックを特定することができます。
timeコマンドが提供する3つの時間
time
コマンドは、実行時間を3つの異なる観点から提供します。
これにより、プログラムのパフォーマンスをより詳細に分析できます。
- real: コマンドの実行が開始されてから終了するまでの実際の経過時間です。
ユーザーが体感する時間に相当します。
- user: プログラムがユーザーモードでCPUを使用した時間です。
計算や処理にかかる時間を示します。
- sys: プログラムがカーネルモードでCPUを使用した時間です。
システムコールや入出力処理にかかる時間を示します。
これらの情報を組み合わせることで、プログラムの動作をより深く理解できます。
timeコマンドの基本的な使い方
time
コマンドの基本的な使い方は非常にシンプルです。
以下のように、計測したいコマンドの前にtime
を付けるだけです。
time ls -l
このコマンドを実行すると、ls -l
コマンドの実行にかかる時間が表示されます。
出力結果は以下のようになります。
real 0m0.002s
user 0m0.000s
sys 0m0.001s
このように、time
コマンドを使うことで、簡単にコマンドの実行時間を計測することができます。
timeコマンドの出力内容
time
コマンドを実行すると、3つの主要な時間情報が出力されます。
それぞれの意味を理解することで、プログラムのパフォーマンスをより正確に評価できます。
real(実時間)とは
real
は、コマンドの実行が開始されてから終了するまでの実際の経過時間を示します。
この時間は、ユーザーが体感する時間に相当し、システムの負荷や他のプロセスの影響を受けることがあります。
例えば、以下のようにtime
コマンドを使ってsleep
コマンドを実行した場合の出力を見てみましょう。
time sleep 2
出力結果は次のようになります。
real 0m2.002s
user 0m0.000s
sys 0m0.000s
この場合、real
は約2秒で、実際に経過した時間を示しています。
user(ユーザーモードのCPU時間)とは
user
は、プログラムがユーザーモードでCPUを使用した時間を示します。
これは、プログラムが実行されている間にCPUがどれだけの時間を費やしたかを表します。
ユーザーモードは、アプリケーションが直接実行される環境であり、通常は計算やデータ処理が行われます。
例えば、次のように計算を行うコマンドを実行した場合の出力を見てみましょう。
time echo $((1000000 * 1000000))
出力結果は次のようになります。
real 0m0.005s
user 0m0.004s
sys 0m0.000s
この場合、user
は約0.004秒で、計算にかかったCPU時間を示しています。
sys(カーネルモードのCPU時間)とは
sys
は、プログラムがカーネルモードでCPUを使用した時間を示します。
カーネルモードは、オペレーティングシステムのカーネルが直接実行される環境であり、システムコールや入出力処理が行われます。
例えば、ファイルの読み込みを行うコマンドを実行した場合の出力を見てみましょう。
time cat /etc/hosts
出力結果は次のようになります。
real 0m0.001s
user 0m0.000s
sys 0m0.001s
この場合、sys
は約0.001秒で、ファイルの読み込みにかかったカーネルモードのCPU時間を示しています。
出力結果の見方と解釈
time
コマンドの出力結果は、以下のように3つの時間情報が表示されます。
real 0m2.002s
user 0m0.004s
sys 0m0.001s
- real: 実際に経過した時間(例: 2.002秒)。
この時間は、他のプロセスの影響を受けるため、必ずしもCPUの使用時間と一致しません。
- user: ユーザーモードでのCPU時間(例: 0.004秒)。
プログラムが実行されている間にCPUが費やした時間です。
- sys: カーネルモードでのCPU時間(例: 0.001秒)。
システムコールや入出力処理にかかった時間です。
これらの情報を総合的に分析することで、プログラムのパフォーマンスを評価し、最適化のための手がかりを得ることができます。
timeコマンドのオプション
time
コマンドには、出力形式や動作を変更するためのさまざまなオプションがあります。
これらのオプションを活用することで、より詳細な情報を得たり、結果をファイルに保存したりすることができます。
-pオプションでの出力フォーマット変更
-p
オプションを使用すると、time
コマンドの出力をPOSIX準拠の形式に変更できます。
この形式では、出力がシンプルで、スクリプトでの解析が容易になります。
time -p ls -l
出力結果は次のようになります。
real 0.002
user 0.000
sys 0.001
このように、-p
オプションを使うことで、出力が簡潔になります。
-vオプションでの詳細な情報表示
-v
オプションを使用すると、time
コマンドの出力が詳細になります。
このオプションを使うことで、メモリ使用量やページフォールトなど、追加の情報を得ることができます。
/usr/bin/time -v ls -l
出力結果は次のようになります。
Command being timed: "ls -l"
User time (seconds): 0.000
System time (seconds): 0.001
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.002
Maximum resident set size (kbytes): 4096
このように、-v
オプションを使うことで、より詳細なパフォーマンス情報を得ることができます。
-oオプションでの結果をファイルに保存
-o
オプションを使用すると、time
コマンドの出力を指定したファイルに保存できます。
これにより、後で結果を確認したり、分析したりすることが容易になります。
/usr/bin/time -o result.txt ls -l
このコマンドを実行すると、result.txt
というファイルに出力が保存されます。
ファイルの内容は次のようになります。
Command being timed: "ls -l"
User time (seconds): 0.000
System time (seconds): 0.001
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.002
Maximum resident set size (kbytes): 4096
-aオプションでのファイルへの追記
-a
オプションを使用すると、-o
オプションで指定したファイルに結果を追記することができます。
これにより、複数のコマンドの結果を1つのファイルにまとめることができます。
/usr/bin/time -o result.txt -a ls -l
/usr/bin/time -o result.txt -a sleep 2
このように、-a
オプションを使うことで、同じファイルに複数の結果を追記できます。
その他のオプション
time
コマンドには、他にもいくつかのオプションがあります。
以下はその一部です。
オプション | 説明 |
---|---|
-h | ヘルプメッセージを表示 |
-f FORMAT | 出力フォーマットを指定 |
-p | POSIX準拠の出力形式に変更 |
-v | 詳細な情報を表示 |
-o FILE | 結果をファイルに保存 |
-a | 結果をファイルに追記 |
これらのオプションを組み合わせることで、time
コマンドの機能を最大限に活用できます。
timeコマンドの応用例
time
コマンドは、さまざまなシナリオで活用できる強力なツールです。
以下に、いくつかの応用例を紹介します。
複数コマンドの実行時間を比較する
複数のコマンドの実行時間を比較することで、どのコマンドがより効率的かを判断できます。
time
コマンドを使って、各コマンドの実行時間を測定し、結果を比較します。
echo "Command 1:"
time sleep 1
echo "Command 2:"
time sleep 2
出力結果は次のようになります。
Command 1:
real 0m1.001s
user 0m0.000s
sys 0m0.000s
Command 2:
real 0m2.002s
user 0m0.000s
sys 0m0.000s
このように、各コマンドの実行時間を比較することで、パフォーマンスの違いを把握できます。
スクリプト全体の実行時間を計測する
シェルスクリプト全体の実行時間を計測することも可能です。
スクリプトの先頭にtime
を追加することで、スクリプト全体の実行時間を測定できます。
#!/bin/bash
# script.sh
time {
sleep 1
echo "Hello, World!"
}
このスクリプトを実行すると、全体の実行時間が表示されます。
real 0m1.001s
user 0m0.000s
sys 0m0.000s
Hello, World!
timeコマンドとパイプの組み合わせ
time
コマンドは、パイプと組み合わせて使用することもできます。
これにより、出力を他のコマンドに渡しつつ、実行時間を計測できます。
time ls -l | grep "txt"
このコマンドを実行すると、ls -l
の出力からtxt
を含む行をフィルタリングしつつ、実行時間も表示されます。
real 0m0.002s
user 0m0.000s
sys 0m0.001s
timeコマンドとシェルスクリプトの連携
シェルスクリプト内でtime
コマンドを使用することで、特定の処理の実行時間を測定できます。
以下の例では、複数のコマンドを実行し、その実行時間を測定しています。
#!/bin/bash
# measure_time.sh
echo "Starting process..."
time {
sleep 1
echo "Process 1 completed."
sleep 2
echo "Process 2 completed."
}
このスクリプトを実行すると、全体の実行時間が表示されます。
Starting process...
Process 1 completed.
Process 2 completed.
real 0m3.003s
user 0m0.000s
sys 0m0.000s
timeコマンドとリダイレクトの活用
time
コマンドの出力をリダイレクトして、ファイルに保存することもできます。
これにより、後で結果を確認したり、分析したりすることが容易になります。
/usr/bin/time -o time_result.txt ls -l
このコマンドを実行すると、time_result.txt
というファイルに実行時間が保存されます。
ファイルの内容は次のようになります。
Command being timed: "ls -l"
User time (seconds): 0.000
System time (seconds): 0.001
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.002
Maximum resident set size (kbytes): 4096
このように、time
コマンドをリダイレクトして使用することで、結果を簡単に保存できます。
timeコマンドの注意点
time
コマンドを使用する際には、いくつかの注意点があります。
これらを理解しておくことで、より正確な計測が可能になります。
timeコマンドとシェル組み込みの違い
time
コマンドには、外部コマンドとしての/usr/bin/time
と、シェルの組み込みコマンドとしてのtime
があります。
これらは動作が異なるため、注意が必要です。
- 外部コマンド:
/usr/bin/time
を使用すると、詳細な情報を得ることができます。
オプションを指定することで、出力形式や内容を変更できます。
- シェル組み込み: シェルの組み込み
time
は、基本的な実行時間の計測のみを行います。
出力内容はシンプルで、詳細な情報は得られません。
このため、必要に応じてどちらを使用するかを選択することが重要です。
timeコマンドの精度と限界
time
コマンドの精度は、システムの負荷や他のプロセスの影響を受けるため、必ずしも正確ではありません。
特に、以下の点に注意が必要です。
- システム負荷: 他のプロセスがCPUを使用している場合、
real
時間が長くなることがあります。
これにより、実際の処理時間よりも長い結果が得られることがあります。
- スリープや待機:
sleep
コマンドなど、待機時間が含まれる場合、real
時間はそのまま反映されますが、CPU時間は短くなることがあります。
このため、計測結果を解釈する際には、これらの要因を考慮する必要があります。
バックグラウンドプロセスの計測における注意点
time
コマンドは、フォアグラウンドプロセスの実行時間を計測するために設計されています。
バックグラウンドプロセスを計測する場合、以下の点に注意が必要です。
- バックグラウンド実行:
&
を使ってバックグラウンドで実行したプロセスの実行時間は、time
コマンドでは正確に計測できません。
バックグラウンドプロセスの実行が完了する前に、シェルが次のコマンドを実行してしまうためです。
- ジョブ制御: バックグラウンドプロセスの実行時間を計測するには、
wait
コマンドを使用して、プロセスが終了するのを待つ必要があります。
例えば、以下のようにします。
time (sleep 2 & wait)
このようにすることで、バックグラウンドプロセスの実行時間を正確に計測できます。
これらの注意点を理解しておくことで、time
コマンドをより効果的に活用できるようになります。
よくある質問
まとめ
この記事では、time
コマンドの基本的な使い方や出力内容、オプション、応用例、注意点について詳しく解説しました。
これにより、コマンドの実行時間を正確に計測し、プログラムのパフォーマンスを評価するための手法を学ぶことができました。
今後は、実際のシステムやスクリプトでtime
コマンドを活用し、効率的なプログラムの開発や最適化に取り組んでみてください。