[Linux] timeコマンドの使い方 – コマンド実行時間の計測

timeコマンドは、指定したコマンドの実行時間を計測するために使用されます。

実行結果として、以下の3つの時間が表示されます:

  1. real: コマンドの開始から終了までの実際の経過時間(壁時計時間)。
  2. user: プロセスがユーザーモードで消費したCPU時間。
  3. sys: プロセスがカーネルモードで消費したCPU時間。

使い方は、timeの後に計測したいコマンドを入力するだけです。

例えば、time lsと入力すると、lsコマンドの実行時間が計測されます。

この記事でわかること
  • timeコマンドの基本的な使い方
  • 実行時間の3つの種類の解説
  • 各種オプションの活用方法
  • 応用例を通じた実践的な利用法
  • 注意点を考慮した計測のポイント

目次から探す

timeコマンドとは

timeコマンドは、LinuxやUnix系のシステムでコマンドの実行時間を計測するためのツールです。

このコマンドを使用することで、特定のプログラムやスクリプトが実行されるのにかかる時間を簡単に測定できます。

計測結果は、実行時間やCPU時間など、さまざまな情報を提供します。

これにより、プログラムのパフォーマンスを評価したり、最適化のためのデータを収集したりすることが可能です。

timeコマンドの概要

timeコマンドは、指定したコマンドの実行にかかる時間を測定し、結果を表示します。

主に以下の情報を提供します。

スクロールできます
時間の種類説明
real実際に経過した時間
userユーザーモードでのCPU時間
sysカーネルモードでのCPU時間

この情報をもとに、プログラムの効率やボトルネックを特定することができます。

timeコマンドが提供する3つの時間

timeコマンドは、実行時間を3つの異なる観点から提供します。

これにより、プログラムのパフォーマンスをより詳細に分析できます。

  1. real: コマンドの実行が開始されてから終了するまでの実際の経過時間です。

ユーザーが体感する時間に相当します。

  1. user: プログラムがユーザーモードでCPUを使用した時間です。

計算や処理にかかる時間を示します。

  1. 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出力フォーマットを指定
-pPOSIX準拠の出力形式に変更
-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コマンドの結果が正確でない理由はいくつかあります。

主な要因は以下の通りです。

  • システム負荷: 他のプロセスがCPUを使用している場合、real時間が長くなることがあります。

これにより、実際の処理時間よりも長い結果が得られることがあります。

  • スリープや待機: sleepコマンドなど、待機時間が含まれる場合、real時間はそのまま反映されますが、CPU時間は短くなることがあります。
  • シェルのオーバーヘッド: シェル自体の処理時間も含まれるため、特に短い処理の場合、計測結果に影響を与えることがあります。

これらの要因を考慮することで、計測結果をより正確に解釈できます。

timeコマンドでメモリ使用量を確認できる?

timeコマンド自体はメモリ使用量を直接表示する機能はありませんが、-vオプションを使用することで、詳細な情報を得ることができます。

このオプションを使うと、最大の常駐セットサイズ(メモリ使用量)などの情報が表示されます。

/usr/bin/time -v ls -l

出力結果には、以下のようなメモリ関連の情報が含まれます。

Maximum resident set size (kbytes): 4096

このように、-vオプションを使うことで、間接的にメモリ使用量を確認することができます。

timeコマンドで並列処理の時間を計測する方法は?

timeコマンドで並列処理の時間を計測するには、バックグラウンドで実行するプロセスの終了を待つ必要があります。

これには、&を使ってプロセスをバックグラウンドで実行し、waitコマンドを使用して全てのバックグラウンドプロセスが終了するのを待ちます。

以下は、並列処理の例です。

time {
  (sleep 2 &)
  (sleep 3 &)
  wait
}

このコマンドを実行すると、全てのバックグラウンドプロセスが終了するまでの時間が計測されます。

出力結果は次のようになります。

real    0m3.003s
user    0m0.000s
sys     0m0.000s

このように、waitコマンドを使うことで、並列処理の実行時間を正確に計測することができます。

まとめ

この記事では、timeコマンドの基本的な使い方や出力内容、オプション、応用例、注意点について詳しく解説しました。

これにより、コマンドの実行時間を正確に計測し、プログラムのパフォーマンスを評価するための手法を学ぶことができました。

今後は、実際のシステムやスクリプトでtimeコマンドを活用し、効率的なプログラムの開発や最適化に取り組んでみてください。

  • URLをコピーしました!
目次から探す