Linuxでコマンドの実行時間を計測する方法|timeコマンド完全解説
- 作成日 2026.06.26
- linux
$ time sleep 2
real 0m2.001s
user 0m0.000s
sys 0m0.001s

Linuxでコマンドやスクリプトの処理にどのくらい時間がかかるか調べたいとき、最もシンプルな方法が time コマンドです。
しかし、
real・user・sysの違いが分からない- ミリ秒・マイクロ秒単位で取得したい
- シェルスクリプト内で実行時間を変数に入れたい
- bash 組み込みの
timeと GNUtimeの違いが分からない - 複数回実行して平均を取りたい
という疑問を持つ方も多いです。本記事ではこれらをまとめて解説します。
目次
結論:先に答えを出す
# 基本:コマンドの前に 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 組み込みの time は TIMEFORMAT 変数で出力フォーマットを制御します。
# デフォルトの出力
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 オプションでフォーマットを指定する
よく使うフォーマット指定子
| 指定子 | 意味 |
|---|---|
%e | real 時間(秒・小数点付き) |
%E | real 時間(時:分:秒形式) |
%U | user 時間(秒) |
%S | sys 時間(秒) |
%P | CPU 使用率(%) |
%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'
参考リンク
関連記事(本サイト)
- vmstat の見方・使い方 – サーバーパフォーマンス監視
- Linux grep オプション一覧 – grepコマンドリファレンス
- Linux sed オプション一覧 – sedコマンドリファレンス
- Linux「command not found」エラーの解決方法 – よくあるLinuxエラー
本記事は2026年6月時点の情報をもとに、Ubuntu 24.04 LTS・bash 5.2・GNU time 1.9 での動作確認に基づき作成しています。macOS では一部コマンドの挙動が異なります。
-
前の記事
【完全版】Ruby/Rails「NameError: uninitialized constant」エラーの原因と対処法|Zeitwerk時代の定数解決 2026.06.26
-
次の記事
rails db:migrate の使い方|マイグレーション作成・実行・ロールバックを徹底解説 2026.06.26
コメントを書く