Linux · 2 分钟阅读
测 Shell 脚本耗时
现代做法是
time命令 +SECONDS变量,或用hyperfine做基准测试。
基础版
start=$(date +%s)
sh target.sh
end=$(date +%s)
echo "耗时: $((end - start)) 秒"
bash 内置:SECONDS
SECONDS=0
sh target.sh
echo "耗时: $SECONDS 秒"
毫秒精度
start=$(date +%s.%N)
sh target.sh
end=$(date +%s.%N)
echo "耗时: $(echo "$end - $start" | bc) 秒"
%N是纳秒,部分系统(macOS BSD date)不支持,GNU coreutils 才有。
time 命令
time sh target.sh
# real 0m2.341s
# user 0m1.020s
# sys 0m0.310s
real— 墙钟时间user— 用户态 CPUsys— 内核态 CPU
进阶:hyperfine
hyperfine 是 Rust 写的基准测试工具,能跑多次给出统计信息:
# macOS
brew install hyperfine
# Linux
apt install hyperfine
hyperfine 'sh target.sh'
hyperfine --warmup 3 --runs 10 'sh target.sh'
输出 mean / median / stddev,多次跑还能检测出抖动。
写入日志
{
start=$(date +%s)
sh target.sh
rc=$?
end=$(date +%s)
echo "[$(date -Iseconds)] rc=$rc 耗时=$((end - start))s" >> /var/log/run.log
}
一些经验
- 测秒级用
SECONDS或date +%s,够用 - 测亚秒级用
date +%s.%N或hyperfine - 写"跑了多久"进日志比"输出到屏幕"更靠谱——后者容易滚走
- 别忘了算
time的real,多核系统下user + sys可能大于real