自动化与脚本
为 shell 工具建立可复现的性能基准测试:统计分析与目标…
当你需要为 shell 脚本/命令行工具设计基准测试、测量并验证性能目标(如 <100ms、>90% 命中率)时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
为 shell 工具建立可复现的性能基准通用
解决思路
- 先定义性能目标再实现:明确缓存导航 <100ms、书签查找 <10ms、缓存加速 >20x、缓存命中率 >90%、缓存构建 <5s 等指标。
- 按标准结构组织基准脚本:Setup(定位 SCRIPT_DIR/REPO_DIR、source bench-helpers.sh 与目标模块)、main 函数(打印配置与标题)、benchmark 函数(分阶段测量)、结尾调用 main 并 exit 0。
- 用 bench_time_ms 做毫秒级高精度计时:用 date +%s%N 取纳秒起止时间,相除 1000000 得到毫秒。
- 测量前先做 warmup:用 bench_warmup "command" 3 运行 3 次预热,减少噪声。
- 用 bench_run "name" "command" 10 跑至少 10 次迭代,逐次打印耗时并收集到数组。
- 用 bench_calculate_stats 计算完整统计量:排序后求 min、max、mean(总和/次数)、median(偶数取中间两值平均,奇数取中值)、stddev(方差开方,优先用 bc,否则用 awk)。
- 用 bench_compare 计算加速比:baseline / optimized,除数为 0 时返回 inf,优先用 bc 否则用 awk。
- 用 bench_percentile 计算任意百分位:排序后取 index = count * percentile / 100。
- 分阶段对比:Phase 1 测 baseline(如先 rm -f ~/.goto_index 强制未缓存),Phase 2 测优化后(如先 __goto_cache_build 再测缓存查找)。
- 用 bench_print_stats 输出 min/max/mean/median/stddev,用 bench_print_comparison 输出 baseline mean、optimized mean、speedup、improvement%。
- 用 bench_assert_target actual target "label" 断言性能达标(actual < target 返回 0),用 bench_assert_improvement baseline optimized min_speedup "label" 断言加速比达标。
- 用 bench_create_workspace 生成不同规模测试工作区:tiny=5、small=10、medium=50、large=500、xlarge=1000 个文件夹,用 mktemp -d 创建。
- 用 bench_create_nested_workspace depth breadth 生成嵌套工作区以测试多级路径(如 LUXOR/unix-goto)。
- 用 bench_cleanup_workspace 清理工作区,且仅当路径以 /tmp/ 开头时才 rm -rf,否则拒绝删除并告警。
- 用 bench_save_result 将结果以 CSV 追加保存到 $BENCH_RESULTS_DIR/results.csv,表头为 timestamp,benchmark_name,operation,min_ms,max_ms,mean_ms,median_ms,stddev,metadata,文件不存在时先写表头。
- 用 bench_load_results 按 name 和可选 operation 从 CSV 中 grep 历史结果,用于趋势与回归检测。
- 用 bench_require_command 与 bench_verify_env 校验依赖命令(date、mktemp)存在且结果目录可写。
- 做可扩展性测试:在 10/50/500/1000 个文件夹规模下分别测量,并随规模调整目标(如 50/75/100/150ms)。
- 做多级路径测试:分别测单级、两级、三级路径查找,各自断言 <100ms 并对比复杂度影响。
- 做并发测试:以 1/5/10/20 并发度各跑 10 轮,用后台 & 与 wait 等待全部完成,统计总耗时与单次耗时。
- 做缓存构建基准:先统计待索引文件夹数,每轮删除 ~/.goto_index 后测 __goto_cache_build,计算每文件夹平均耗时并断言 <5000ms。
- 保证统计有效性:至少 10 次迭代、3 次以上预热、报告 median 作为中心趋势、报告 stddev 体现一致性。
- 保证隔离与可复现:在空闲系统上运行、关闭无关后台进程、阶段间清缓存、使用专用测试工作区、记录全部配置并保存所有结果。
- 关注告警信号:stddev 超过 mean 的 20% 表示不稳定,随时间上升表示性能回归,max 远大于 mean 表示存在离群值。
- 按用户感知设定目标:<50ms 瞬时、<100ms 很快、<200ms 快、<1s 可接受、>1s 偏慢需优化。
适用边界 · 注意事项
- 应用级性能剖析(应使用语言专用 profiler)
- 生产环境性能监控(应使用 APM 工具)
- Web 服务负载测试(应使用 JMeter、k6 等)
- 只需简单计时(直接用 time 命令即可)