做什么

测量命令的执行时间。

time some-command
# real    0m1.234s
# user    0m0.500s
# sys     0m0.200s

三个数字

含义
real 墙上时钟时间(实际经过)
user CPU 在用户态消耗的时间
sys CPU 在内核态消耗的时间
user + sys ≈ CPU 总用时
real - (user + sys) ≈ IO 等待 / 睡眠 / 调度时间
  • 多核并行:user + sys 可能 大于 real
  • 大量 IO:real 远大于 user + sys

实战

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

time make build                       # 看构建多久
time python myscript.py
time curl https://example.com

# 多次测平均
for i in {1..5}; do time some-command; done

bash 内置 time vs /usr/bin/time

shell 内置:

time some-command

外部(更多信息):

/usr/bin/time -v some-command
# 输出含:内存峰值、上下文切换、IO 次数等

/usr/bin/time --format="%e seconds, %M KB max RAM" some-command

-v 看资源用量是性能调优的好工具。

测脚本时长(脚本内部)

#!/bin/bash
start=$(date +%s)
# ... 业务 ...
end=$(date +%s)
echo "Took $((end - start)) seconds"

亚秒级用 $EPOCHREALTIME(bash 5+):

start=$EPOCHREALTIME
# ...
end=$EPOCHREALTIME
echo "Took $(echo "$end - $start" | bc) s"

高级:精细性能分析

  • perf:CPU profile
  • strace:系统调用追踪
  • ltrace:库调用
  • hyperfine多次跑 + 统计标准差(推荐 benchmark)
sudo apt install hyperfine
hyperfine 'cmd1' 'cmd2'                # 自动跑多次对比

  • shell 内置 time 在管道里行为怪——time cmd | wc -l 测的是 time 之后的命令组
  • 加管道时用括号:time (cmd1 | cmd2)
  • time -v/usr/bin/time 的功能,不是 bash 内置