- Update benchmarks/v0.4.0/REPORT.md with optimization results: Task A access-log sampling (-29% latency, -65% allocs), Task B file-cache fix (-99.8% allocs, +73% throughput), Task C RemoteAddr string caching. - Add scripts/bench-compare.sh to compare two benchmark summaries and flag regressions beyond configurable thresholds. - Add benchmark-pprof.yaml for reproducible pprof collection.
113 lines
3.4 KiB
Bash
Executable File
113 lines
3.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# bench-compare.sh — 比较两次基准测试结果,检测性能回归。
|
||
#
|
||
# 用法:
|
||
# ./scripts/bench-compare.sh <old-summary> <new-summary>
|
||
#
|
||
# 返回码:
|
||
# 0 — 无显著回归
|
||
# 1 — 检测到显著回归(默认阈值: latency +10%, allocs +10%)
|
||
#
|
||
# 示例:
|
||
# ./scripts/bench-compare.sh benchmarks/v0.4.0/summary.txt benchmarks/v0.5.0/summary.txt
|
||
|
||
set -euo pipefail
|
||
|
||
OLD="${1:-}"
|
||
NEW="${2:-}"
|
||
|
||
if [[ -z "$OLD" || -z "$NEW" ]]; then
|
||
echo "用法: $0 <old-summary> <new-summary>" >&2
|
||
exit 2
|
||
fi
|
||
|
||
if [[ ! -f "$OLD" ]]; then
|
||
echo "错误: 找不到旧摘要文件: $OLD" >&2
|
||
exit 2
|
||
fi
|
||
|
||
if [[ ! -f "$NEW" ]]; then
|
||
echo "错误: 找不到新摘要文件: $NEW" >&2
|
||
exit 2
|
||
fi
|
||
|
||
LATENCY_THRESH="${LATENCY_THRESH:-10.0}"
|
||
ALLOCS_THRESH="${ALLOCS_THRESH:-10.0}"
|
||
RPS_THRESH="${RPS_THRESH:--10.0}"
|
||
|
||
echo "=== 基准比较 ==="
|
||
printf "%-40s %12s %12s %12s\n" "Benchmark" "Old" "New" "Change%"
|
||
echo "----------------------------------------------------------------------"
|
||
|
||
REGRESSION=0
|
||
|
||
# 提取并比较关键微基准(ns/op 和 B/op)
|
||
# 格式: BenchmarkName-NN 1234 ns/op 567 B/op 890 allocs/op
|
||
compare_metric() {
|
||
local bench="$1"
|
||
local metric="$2"
|
||
local thresh="$3"
|
||
local better_is_lower="${4:-1}"
|
||
|
||
local old_val new_val
|
||
old_val=$(grep -E "^${bench}" "$OLD" | grep -oE "[0-9]+(\.[0-9]+)?[[:space:]]*${metric}" | head -1 | awk '{print $1}')
|
||
new_val=$(grep -E "^${bench}" "$NEW" | grep -oE "[0-9]+(\.[0-9]+)?[[:space:]]*${metric}" | head -1 | awk '{print $1}')
|
||
|
||
if [[ -z "$old_val" || -z "$new_val" ]]; then
|
||
return 0
|
||
fi
|
||
|
||
if awk -v o="$old_val" 'BEGIN { exit (o == 0) ? 0 : 1 }'; then
|
||
printf "%-40s %12s %12s %11s%%\n" "$bench ($metric)" "$old_val" "$new_val" "N/A"
|
||
return 0
|
||
fi
|
||
|
||
local change
|
||
change=$(awk -v o="$old_val" -v n="$new_val" 'BEGIN { printf "%.2f", ((n - o) / o) * 100 }')
|
||
local abs_change
|
||
abs_change=$(awk -v c="$change" 'BEGIN { printf "%.2f", c < 0 ? -c : c }')
|
||
|
||
printf "%-40s %12s %12s %11s%%\n" "$bench ($metric)" "$old_val" "$new_val" "$change"
|
||
|
||
if awk -v c="$abs_change" -v t="$thresh" 'BEGIN { exit (c > t) ? 0 : 1 }'; then
|
||
if [[ "$better_is_lower" == "1" && $(awk -v c="$change" 'BEGIN { print (c > 0) ? 1 : 0 }') -eq 1 ]]; then
|
||
echo " ⚠️ 回归警告: $bench $metric 增加 ${change}% (阈值 ${thresh}%)" >&2
|
||
REGRESSION=1
|
||
elif [[ "$better_is_lower" == "0" && $(awk -v c="$change" 'BEGIN { print (c < 0) ? 1 : 0 }') -eq 1 ]]; then
|
||
echo " ⚠️ 回归警告: $bench $metric 降低 ${change}% (阈值 ${thresh}%)" >&2
|
||
REGRESSION=1
|
||
fi
|
||
fi
|
||
}
|
||
|
||
# 关键基准测试前缀列表(前缀匹配)
|
||
BENCHMARKS=(
|
||
"BenchmarkAccessLogProcess"
|
||
"BenchmarkFileCacheGet"
|
||
"BenchmarkProxyCacheGet"
|
||
"BenchmarkStaticFile"
|
||
"BenchmarkStaticIndex"
|
||
"BenchmarkStaticTryFiles"
|
||
"BenchmarkProxyForward"
|
||
"BenchmarkProxyHostClient"
|
||
"BenchmarkProxyWithMockBackend"
|
||
"BenchmarkMiddlewareProcessChain"
|
||
"BenchmarkMiddlewareChainExecution"
|
||
"BenchmarkCompressionMiddleware"
|
||
"BenchmarkDNSResolverLookupWithCache"
|
||
)
|
||
|
||
for bench in "${BENCHMARKS[@]}"; do
|
||
compare_metric "$bench" "ns/op" "$LATENCY_THRESH" 1
|
||
compare_metric "$bench" "B/op" "$ALLOCS_THRESH" 1
|
||
done
|
||
|
||
echo ""
|
||
if [[ "$REGRESSION" -eq 0 ]]; then
|
||
echo "✅ 未检测到显著性能回归"
|
||
exit 0
|
||
else
|
||
echo "❌ 检测到性能回归,请检查上述警告"
|
||
exit 1
|
||
fi
|