Files
tamabox/dev/bench-cdn.sh
T
2026-09-08 10:10:44 +08:00

97 lines
3.9 KiB
Bash

#!/bin/bash
# ============================================================================
# bench-cdn.sh — UIkit CDN 测速脚本(国内 / 海外双视角)
#
# 用途:对比"自建 R2 自托管 uikit"与"公共 CDN (cdnjs.snrat.com)"的加载速度,
# 用于验证/复测 2026-09-05 的 CDN 迁移是否持续生效。
#
# 用法:
# bash dev/bench-cdn.sh cn # 国内本机:每资源 5 次全量下载取中位
# bash dev/bench-cdn.sh global # 海外:check-host.net 多区域节点 (p50/p90)
#
# 数据结论参考(2026-09-05 基线,国内中位):
# css R2 0.864s -> snrat 0.200s (4.3x)
# js R2 0.796s -> snrat 0.163s (4.9x)
# icons R2 0.824s -> snrat 0.177s (4.7x)
# 海外(check-host p50):css 打平;js R2 372ms vs snrat 647ms (R2 略快)
# 结论:站点访客以国内为主 -> snrat 净收益大;海外属轻微下降可接受。
# ============================================================================
OLD_CSS="https://r2.337845818.best/tamabox/cdn/expire-1-y/uikit/3.3.3/css/modify-black-font/uikit.min.css"
NEW_CSS="https://cdnjs.snrat.com/ajax/libs/uikit/3.3.3/css/uikit.min.css"
OLD_JS="https://r2.337845818.best/tamabox/cdn/lib/uikit/3.3.3/js/uikit.min.js"
NEW_JS="https://cdnjs.snrat.com/ajax/libs/uikit/3.3.3/js/uikit.min.js"
OLD_ICONS="https://r2.337845818.best/tamabox/cdn/lib/uikit/3.3.3/js/uikit-icons.min.js"
NEW_ICONS="https://cdnjs.snrat.com/ajax/libs/uikit/3.3.3/js/uikit-icons.min.js"
# ---------- 国内:全量下载计时 ----------
bench_cn() {
echo "== 国内本机:每资源 5 次全量下载(秒),取中位 =="
local pairs=(
"OLD-css (R2 modify):$OLD_CSS"
"NEW-css (snrat) :$NEW_CSS"
"OLD-js (R2) :$OLD_JS"
"NEW-js (snrat) :$NEW_JS"
"OLD-icons (R2) :$OLD_ICONS"
"NEW-icons (snrat) :$NEW_ICONS"
)
for entry in "${pairs[@]}"; do
local name="${entry%%:*}"; local url="${entry#*:}"
local vals=()
for i in 1 2 3 4 5; do
vals+=("$(curl -sS -o /dev/null -w '%{time_total}' --max-time 20 "$url" 2>/dev/null)")
done
local sorted=($(printf '%s\n' "${vals[@]}" | sort -n))
local med="${sorted[2]}"
printf '%-20s : [%s] 中位=%ss\n' "$name" "${vals[*]}" "$med"
done
}
# ---------- 海外:check-host.net 多区域节点 ----------
probe_global() {
local name="$1" url="$2"
local enc
enc=$(python3 -c "import urllib.parse,sys;print(urllib.parse.quote(sys.argv[1],safe=''))" "$url")
local rid
rid=$(curl -sS -H "Accept: application/json" \
"https://check-host.net/check-http?host=$enc&max_nodes=12" 2>/dev/null \
| python3 -c "import sys,json;print(json.load(sys.stdin).get('request_id',''))")
[ -z "$rid" ] && { echo "$name: 请求失败"; return; }
sleep 8
curl -sS -H "Accept: application/json" "https://check-host.net/check-result/$rid" 2>/dev/null \
| python3 -c "
import sys,json,statistics
d=json.load(sys.stdin)
ms=[]
for node,arr in (d or {}).items():
if not arr or not arr[0]: continue
r=arr[0]
if len(r)>3 and str(r[3]).startswith('2') and isinstance(r[1],(int,float)):
ms.append(r[1]*1000)
if ms:
ms.sort()
print(f'$name | n={len(ms)} | min={ms[0]:.0f} | p50={statistics.median(ms):.0f} | p90={ms[int(len(ms)*0.9)-1]:.0f} | max={ms[-1]:.0f} ms')
else:
print(f'$name | 无有效节点')
"
}
bench_global() {
echo "== 海外:check-host.net 多区域节点探测(HTTP 200 的耗时统计)=="
probe_global "OLD css (R2 modify)" "$OLD_CSS"
probe_global "NEW css (snrat)" "$NEW_CSS"
probe_global "OLD js (R2)" "$OLD_JS"
probe_global "NEW js (snrat)" "$NEW_JS"
}
case "$1" in
cn) bench_cn ;;
global) bench_global ;;
*)
echo "用法: bash dev/bench-cdn.sh {cn|global}"
echo " cn = 国内本机全量下载测速"
echo " global = 海外 check-host.net 多区域探测"
exit 1
;;
esac