#!/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