Repo .git was damaged (refs/ missing, index truncated, object store near-empty). Repaired via git init (rebuilt refs), stale index preserved as .git/index.corrupt-20260910.bak, then full worktree committed as a rollback baseline.
97 lines
3.9 KiB
Bash
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
|