做什么
测量命令的执行时间。
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 profilestrace:系统调用追踪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 内置