Linuxでコマンドの実行時間を計測する方法|timeコマンド完全解説

  • 作成日 2026.06.26
  • linux
Linuxでコマンドの実行時間を計測する方法|timeコマンド完全解説

$ time sleep 2
real    0m2.001s
user    0m0.000s
sys     0m0.001s

Linuxでコマンドやスクリプトの処理にどのくらい時間がかかるか調べたいとき、最もシンプルな方法が time コマンドです。

しかし、

  • realusersys の違いが分からない
  • ミリ秒・マイクロ秒単位で取得したい
  • シェルスクリプト内で実行時間を変数に入れたい
  • bash 組み込みの time と GNU time の違いが分からない
  • 複数回実行して平均を取りたい

という疑問を持つ方も多いです。本記事ではこれらをまとめて解説します。


目次

結論:先に答えを出す

# 基本:コマンドの前に time を付けるだけ
time コマンド

# 例
time ls -la /usr/bin/
time sleep 3
time tar -czf archive.tar.gz /var/log/

# ミリ秒で計測したい(GNU time)
/usr/bin/time -f "%e秒 (%E)" コマンド

# スクリプト内で経過時間を計測
START=$(date +%s%N)
# 処理
END=$(date +%s%N)
echo "$(( (END - START) / 1000000 ))ms"

基本的な使い方

time コマンド [引数]

# 例
time ls /usr/bin/
time find / -name "*.log" 2>/dev/null
time python3 script.py
time curl -s https://example.com > /dev/null

出力の例

$ time sleep 2

real    0m2.001s
user    0m0.000s
sys     0m0.001s

real・user・sys の違い

time の出力で最も重要な部分です。

フィールド意味別名
real実際に経過した時間(壁時計の時間)elapsed time・wall time
userユーザー空間でCPUを使った時間user CPU time
sysカーネル空間でCPUを使った時間system CPU time

具体例で理解する

# 例1:sleep(何もしないで待つ)
$ time sleep 3
real    0m3.001s   ← 3秒待った
user    0m0.000s   ← CPU は使っていない
sys     0m0.001s   ← カーネルもほぼ使っていない
# 例2:CPU を使う処理(数値計算)
$ time python3 -c "sum(range(10**8))"
real    0m3.456s   ← 実際に経過した時間
user    0m3.450s   ← ほぼ全部 CPU 計算に使われた
sys     0m0.006s   ← カーネル処理は少ない
# 例3:ファイルI/Oが多い処理
$ time find / -name "*.conf" 2>/dev/null
real    0m5.234s   ← I/O 待ちが多いので real が長い
user    0m0.234s   ← CPU 使用は少ない
sys     0m1.123s   ← カーネルのI/O処理が多い
# 例4:マルチスレッド処理(並列実行)
$ time python3 parallel_script.py
real    0m1.234s   ← 実際の経過時間(並列で短縮)
user    0m4.567s   ← 4コア分の CPU 時間の合計(real より長い)
sys     0m0.089s

読み方のポイント

real > user + sys
  → I/O 待ち・sleep・ネットワーク待ちが多い

user + sys ≒ real
  → CPU バウンドな処理(計算が多い)

user + sys > real
  → マルチコアで並列実行されている

sys が高い
  → システムコール・I/O・メモリ割り当てが多い

bash 組み込み time と GNU time の違い

time コマンドは2種類あります。

bash 組み込みの time(デフォルト)

# どちらかを確認
type time
# time is a shell keyword  ← bash 組み込み

bash 組み込みの timeTIMEFORMAT 変数で出力フォーマットを制御します。

# デフォルトの出力
real    0m0.001s
user    0m0.000s
sys     0m0.000s

# TIMEFORMAT で出力形式を変更
TIMEFORMAT="%R秒"
time ls > /dev/null
# 0.002秒

TIMEFORMAT="real: %Rs  user: %Us  sys: %Ss  CPU: %P%%"
time ls > /dev/null
# real: 0.002s  user: 0.001s  sys: 0.001s  CPU: 80%

# TIMEFORMAT の書式
# %R → real(秒・小数点付き)
# %U → user(秒・小数点付き)
# %S → sys(秒・小数点付き)
# %P → CPU使用率(%)

GNU time(/usr/bin/time)

より高機能なバージョンです。メモリ使用量なども取得できます。

# フルパスで呼び出す(bash 組み込みより優先するため)
/usr/bin/time ls

# または \ で bash 組み込みをバイパス
\time ls

# インストールされていない場合
sudo apt install time   # Ubuntu/Debian
sudo dnf install time   # RHEL/CentOS/Fedora
# GNU time のデフォルト出力
$ /usr/bin/time ls > /dev/null
0.00user 0.00system 0:00.00elapsed 80%CPU (0avgtext+0avgdata 2048maxresident)k
0inputs+0outputs (0major+73minor)pagefaults 0swaps

GNU time の -f オプションでフォーマットを指定する

よく使うフォーマット指定子

指定子意味
%ereal 時間(秒・小数点付き)
%Ereal 時間(時:分:秒形式)
%Uuser 時間(秒)
%Ssys 時間(秒)
%PCPU 使用率(%)
%M最大メモリ使用量(KB)
%x終了コード
%Cコマンド名と引数
# シンプルに秒数だけ表示
/usr/bin/time -f "%e秒" sleep 1
# 1.00秒

# real/user/sys を見やすく表示
/usr/bin/time -f "real: %es  user: %Us  sys: %Ss  CPU: %P" ls > /dev/null
# real: 0.00s  user: 0.00s  sys: 0.00s  CPU: 80%

# メモリ使用量も表示
/usr/bin/time -f "時間: %es  メモリ: %MKB" python3 script.py
# 時間: 2.34s  メモリ: 51234KB

# コマンド名付きで表示
/usr/bin/time -f "%C → %es" ls /usr/bin/ > /dev/null
# ls /usr/bin/ → 0.01s

結果をファイルに保存(-o オプション)

# ファイルに書き出す
/usr/bin/time -o /tmp/time_result.txt ls

# 追記モード(-a)
/usr/bin/time -a -o /tmp/time_result.txt ls
/usr/bin/time -a -o /tmp/time_result.txt find /usr

# フォーマット指定と組み合わせ
/usr/bin/time -f "%e" -o /tmp/elapsed.txt コマンド

ミリ秒・マイクロ秒で計測する

time の出力は秒単位(小数点以下3桁)です。より細かく計測する方法を紹介します。

date コマンドで計測(ナノ秒対応)

# ミリ秒で計測
START=$(date +%s%N)
sleep 0.5
END=$(date +%s%N)
echo "$(( (END - START) / 1000000 ))ms"
# 501ms

# マイクロ秒で計測
echo "$(( (END - START) / 1000 ))μs"
# 501234μs

関数化して使いやすくする

measure() {
  local START=$(date +%s%N)
  "$@"
  local END=$(date +%s%N)
  local MS=$(( (END - START) / 1000000 ))
  echo "実行時間: ${MS}ms" >&2
}

# 使い方
measure sleep 1
# 実行時間: 1001ms

measure find /usr -name "*.conf" > /dev/null
# 実行時間: 234ms

スクリプトでの活用

処理時間を変数に格納する

#!/bin/bash

# 方法1:TIMEFORMAT と time を組み合わせる
TIMEFORMAT="%R"
ELAPSED=$( { time sleep 1; } 2>&1 )
echo "実行時間: ${ELAPSED}秒"

# 方法2:date コマンドで計測
START=$(date +%s%N)
sleep 1
END=$(date +%s%N)
ELAPSED_MS=$(( (END - START) / 1000000 ))
echo "実行時間: ${ELAPSED_MS}ms"

# 方法3:GNU time の出力をキャプチャ
ELAPSED=$(/usr/bin/time -f "%e" sleep 1 2>&1)
echo "実行時間: ${ELAPSED}秒"

各ステップの時間を計測する

#!/bin/bash

measure_step() {
  local name="$1"
  shift
  local start=$(date +%s%N)
  "$@"
  local end=$(date +%s%N)
  local ms=$(( (end - start) / 1000000 ))
  echo "✓ ${name}: ${ms}ms"
}

measure_step "データ取得"    curl -s https://api.example.com/data -o /tmp/data.json
measure_step "データ処理"    python3 process.py /tmp/data.json
measure_step "アップロード"  rsync /tmp/result/ user@server:/data/

閾値を超えたら警告する

#!/bin/bash

MAX_SECONDS=5

START=$(date +%s)
python3 heavy_script.py
END=$(date +%s)
ELAPSED=$((END - START))

if [ $ELAPSED -gt $MAX_SECONDS ]; then
  echo "警告: 処理時間が ${ELAPSED}秒 かかりました(閾値: ${MAX_SECONDS}秒)"
else
  echo "完了: ${ELAPSED}秒"
fi

複数回実行して平均を取る

ベンチマークでは複数回の平均を使う方が正確です。

bash でループ計測

#!/bin/bash

N=10
TOTAL=0

for i in $(seq 1 $N); do
  START=$(date +%s%N)
  ls /usr/bin/ > /dev/null
  END=$(date +%s%N)
  MS=$(( (END - START) / 1000000 ))
  TOTAL=$((TOTAL + MS))
  echo "試行 $i: ${MS}ms"
done

echo "平均: $((TOTAL / N))ms"

hyperfine(ベンチマーク専用ツール)

# インストール
sudo apt install hyperfine   # Ubuntu 22.04以降

# 基本的な使い方(自動で複数回計測・統計を出す)
hyperfine 'ls /usr/bin/'

# 出力例
Benchmark 1: ls /usr/bin/
  Time (mean ± σ):     3.2 ms ±   0.5 ms    [User: 1.8 ms, System: 1.4 ms]
  Range (min … max):   2.5 ms …   4.9 ms    50 runs

# 複数コマンドを比較
hyperfine 'grep -r "TODO" /usr/bin/' 'rg "TODO" /usr/bin/'

# ウォームアップ回数を指定
hyperfine --warmup 5 'cat /etc/hosts'

# 結果をエクスポート
hyperfine --export-markdown result.md 'コマンド1' 'コマンド2'
hyperfine --export-json result.json 'コマンド'

他の計測方法との使い分け

perf stat(詳細なCPU統計)

# インストール
sudo apt install linux-perf

# 実行時間と CPU 統計を同時に確認
perf stat ls /usr/bin/ 2>&1

strace -T(システムコール単位の計測)

# 各システムコールの実行時間を表示
strace -T ls 2>&1 | head -20

# 遅いシステムコールを特定
strace -T コマンド 2>&1 | sort -t'<' -k2 -rn | head -10

用途別の使い分け表

用途推奨ツール
手軽に実行時間を確認time コマンド
ミリ秒・マイクロ秒で計測date +%s%N
メモリ使用量も確認/usr/bin/time -f "%e %M"
複数コマンドを比較hyperfine
CPU の詳細な統計perf stat
スクリプト内で変数に入れるdate +%s%N
CI/CD でベンチマークを記録hyperfine --export-json

macOS での違い

macOS の date コマンドは BSD 版のため、ナノ秒(%N)が使えません。

# macOS では動かない
date +%s%N

# 代替方法1:python3 を使う
python3 -c "import time; print(int(time.time() * 1000))"  # ミリ秒

# 代替方法2:GNU coreutils を使う
brew install coreutils
gdate +%s%N

# bash 組み込みの time は macOS でも同様に使える
time sleep 1

よくある質問(FAQ)

Q1. real が user + sys より短い場合があるのはなぜですか?

マルチコアで並列処理している場合、複数の CPU が同時に動くため user + sys の合計が real より長くなることがあります。逆に real > user + sys の場合はI/O待ちやスリープが多いことを意味します。

Q2. time の出力をファイルに保存したい

# bash 組み込みは stderr に出力されるため
{ time ls; } 2> time_result.txt

# GNU time は -o オプションを使う
/usr/bin/time -o result.txt ls

Q3. パイプを使ったコマンド全体の時間を計測したい

# パイプ全体を () または {} で囲む
time (grep -r "TODO" /usr/src/ | wc -l)
time { grep -r "TODO" /usr/src/ | wc -l; }

Q4. シェルスクリプト全体の実行時間を計測したい

# スクリプト全体を time で計測
time bash myscript.sh

# スクリプト内で計測する場合
SCRIPT_START=$(date +%s%N)
# ... 処理 ...
SCRIPT_END=$(date +%s%N)
echo "合計: $(( (SCRIPT_END - SCRIPT_START) / 1000000 ))ms"

Q5. time コマンドが見つからないと言われます

# bash 組み込みは常に使えるはずなので type で確認
type time
# time is a shell keyword  ← 必ずある

# /usr/bin/time がない場合は別途インストール
sudo apt install time

まとめ

Linuxでコマンドの実行時間を計測する方法をまとめます。

最もシンプル:

time コマンド

出力の見方:

real  → 実際に経過した時間(主にこれを見る)
user  → アプリが CPU を使った時間
sys   → カーネルが CPU を使った時間

ミリ秒で計測:

START=$(date +%s%N)
コマンド
END=$(date +%s%N)
echo "$(( (END - START) / 1000000 ))ms"

メモリ使用量も確認:

/usr/bin/time -f "時間: %es  メモリ: %MKB" コマンド

複数コマンドを比較:

hyperfine 'コマンド1' 'コマンド2'

参考リンク

関連記事(本サイト)


本記事は2026年6月時点の情報をもとに、Ubuntu 24.04 LTS・bash 5.2・GNU time 1.9 での動作確認に基づき作成しています。macOS では一部コマンドの挙動が異なります。