R / Richie全部文章 ↑

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 — 用户态 CPU
  • sys — 内核态 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

参考