要精确测量脚本执行毫秒级耗时,macOS下推荐三种方法:①用bash内置time+TIMEFORMAT='%R'获取real time;②用date +%s.%N配合awk计算毫秒差值;③用hyperfine做多轮统计并输出均值与标准差。

Mac终端中需要知道某个脚本执行到底花了多少毫秒,而不是笼统的“0.234s”这种四舍五入后的显示——因为毫秒级差异直接影响压测阈值判断、性能回归基线比对或throttling触发时机验证。
用time命令加-bash内置高精度计时
macOS默认的/usr/bin/time输出粗糙,且不支持毫秒以下精度;必须改用bash内置的time关键字,并配合TIMEFORMAT强制展开到毫秒。
第一步:在终端中输入TIMEFORMAT='%R'; time your_script.sh,例如TIMEFORMAT='%R'; time sleep 0.123。
第二步:观察输出——此时显示的是带三位小数的秒数(如0.123),即123毫秒。注意:这个值是real time,包含进程调度与I/O等待,适合端到端耗时评估。
第三步:若需排除shell启动开销,把脚本内容用bash -c "..."包裹再测,例如TIMEFORMAT='%R'; time bash -c 'for i in {1..1000}; do echo -n "."; done > /dev/null'。
用date命令做前后差值计算(纳秒级起点)
当需要比time更底层、可嵌入脚本逻辑的计时方式时,用date +%s.%N获取纳秒时间戳再相减,结果可精确到微秒,但需手动处理小数点对齐。
方法一:单行快速测(推荐用于临时验证)
start=$(date +%s.%N); your_script.sh; end=$(date +%s.%N); awk -v s="$start" -v e="$end" 'BEGIN{printf "%.3f\n", (e-s)*1000}'
这行命令会直接输出脚本执行耗时的毫秒数,保留三位小数,例如127.456。
方法二:封装为函数复用(适合写进.zshrc)
在~/.zshrc中添加:
function mstime() { local s=$(date +%s.%N); "$@"; local e=$(date +%s.%N); awk -v st="$s" -v et="$e" 'BEGIN{printf "%.3f ms\n", (et-st)*1000}'; }
之后在任意目录下执行mstime python3 -c "import time; time.sleep(0.042)",立即得到42.189 ms这类结果。
【注意】%N在macOS上实际只精确到毫秒(非纳秒),但已足够覆盖绝大多数脚本性能分析需求;若需真纳秒级,请用mach_absolute_time()配合C代码调用。
用hyperfine做多次运行统计(含标准差)
单次测量易受系统抖动干扰,尤其测试GPU密集型或I/O阻塞型脚本时,必须跑多轮取统计分布。hyperfine是macOS上最轻量、最可靠的命令行基准测试工具。
第一步:用Homebrew安装brew install hyperfine。
第二步:执行hyperfine --warmup 3 --min-runs 10 'your_script.sh'。
第三步:查看输出中的Mean和σ字段——Mean是10次运行的平均毫秒数,σ是标准差,单位均为毫秒;若σ超过Mean的5%,说明系统负载波动大,需检查是否有后台进程干扰。
hyperfine默认禁用shell解析,所以脚本路径含空格或特殊字符时,必须用单引号包裹命令,否则会报错找不到文件。

















