Go 重写的性能基准
下面分别列出本次候选包的命令耗时,以及重写期间的历史资源测量。它们来自不同版本和场景,不能拼成同一次基准结果。
1.6.1 与 2.0.0rc1 的命令耗时
测量日期:2026-09-21。使用 GitHub Actions 构建的 1.6.1 与 2.0.0rc1 草稿候选包,安装后逐个核验实际文件;Go 还核验了运行进程的二进制。两台 OpenWrt 虚拟机均为 1 CPU、128 MiB 内存、x86_64 TCG。每个操作、每个版本保留 60 次有效采样。
| 操作 | Python 1.6.1 中位 / P95(ms) | Go rc1 中位 / P95(ms) | 中位耗时比 |
|---|---|---|---|
| 帮助 | 4,383.53 / 6,746.90 | 31.27 / 49.35 | 140.18× |
| 版本 | 4,508.01 / 6,029.35 | 30.18 / 45.76 | 149.38× |
| 读取配置 | 4,366.32 / 6,016.13 | 36.87 / 46.00 | 118.41× |
| 列出账号 | 4,473.03 / 5,875.93 | 37.23 / 50.63 | 120.16× |
| 列出内置认证策略 | 4,646.86 / 6,022.29 | 33.90 / 49.10 | 137.07× |
| CLI 状态 | 4,778.42 / 6,464.95 | 36.79 / 61.17 | 129.89× |
| 导出配置 | 4,909.43 / 7,140.74 | 37.08 / 56.22 | 132.40× |
“中位耗时比”是 Python 中位耗时 ÷ Go 中位耗时,大于 1 表示 Go 更快。P95 使用排序后第 57 个样本。这些绝对耗时包含软件模拟 CPU 的开销,不能直接当作实体路由器的毫秒数或加速倍数。
串行执行速率
以下速率为 1000 ÷ 平均耗时(毫秒),表示一个调用方连续完成命令的速度,不是并发容量或网络吞吐率。
| 操作 | Python 1.6.1(次/秒) | Go rc1(次/秒) |
|---|---|---|
| 帮助 | 0.22 | 27.79 |
| 版本 | 0.22 | 31.10 |
| 读取配置 | 0.23 | 25.99 |
| 列出账号 | 0.21 | 26.31 |
| 列出内置认证策略 | 0.21 | 27.27 |
| CLI 状态 | 0.20 | 24.04 |
| 导出配置 | 0.20 | 24.92 |
LuCI 与后台响应
LuCI 状态请求单独计时:包含宿主回环 HTTP、QEMU 端口转发、uhttpd、LuCI 和后端处理,不包含浏览器绘制或页面轮询等待。
| 操作 | Python 1.6.1 中位 / P95(ms) | Go rc1 中位 / P95(ms) | 中位耗时比 |
|---|---|---|---|
| LuCI 状态请求 | 209.70 / 312.43 | 222.96 / 357.83 | 0.94× |
下表只测 Go 常驻服务的本地套接字往返:从建连到完整响应,不启动 CLI 进程。旧版没有相同的后台 RPC 接口,因此不编造一列可比的 Python 数字。
| Go 后台接口 | 中位耗时(ms) | P95(ms) |
|---|---|---|
status.get | 2.03 | 3.47 |
config.get | 2.49 | 3.75 |
help 和版本命令不需要校园网络响应,但仍包含新进程启动、初始化及命令自身工作,不是纯语言启动跑分;配置类命令还包含序列化、读取及 IPC。Python 的 status 会现场查询认证网关,Go 的 status 读取后台维护的状态,所以状态差距还包含调用方式的变化。命令响应变快不等于认证服务器变快,也不保证切换 IP/NAT 出口时游戏连接不断。
环境与复测
- Python 来源:3829f52,构建记录。Go 来源:6db20d9,构建记录。版本、包 SHA256 和签名验证情况见原始汇总。旧版 APK 按已核验来源手动安装;Go APK 使用固定维护者公钥通过原生验签。
- 两台来宾使用同一官方 OpenWrt 25.12.2 基础镜像及相同 LuCI、模拟网卡;沿用各版本原生依赖。镜像压缩文件 SHA256:
461926ed535d9185604a2ae57b7a167fe00b83fbeb23fdba7663072117f6e0dc。 - 配置为同一个合成有线账号,自动认证、夜间切换和故障切换关闭。状态查询使用宿主本地模拟网关,确定返回未认证;没有真实账号、校园网往返、登录或切网操作。所有命令退出码为 0,HTTP 请求为 200,测量前后配置字节不变,内核没有 OOM 记录。
- 每项分四轮、每轮 15 次,轮流交换版本先后次序;同一时刻只测一台来宾。第一轮先预热 5 次,其余轮预热 1 次。后台 RPC 每轮预热 5 次。这是热缓存下反复启动命令的测试,不是重启设备后的冷启动测试。
- CLI 由来宾内 C 工具用
CLOCK_MONOTONIC测量fork → exec → wait,标准输入、输出和错误流接/dev/null,不计 SSH 建连时间。原始样本还保留了/bin/true计时下限、宿主负载和轮次;测量不是独占物理 CPU 的跑分。
下载:汇总与命令参数、原始采样与复测工具 ZIP、下载文件校验和。ZIP 内含全部逐次样本、C 计时工具、汇总和逐文件校验和。
本次工具在 x86_64 Linux 宿主编译,然后复制到对应来宾执行;其他架构需要对应编译器。例如:
gcc -O2 -static -Wall -Wextra -o cli-timer timer.c
# 在测试来宾中预热 5 次,再采样 15 次;重复四轮并交换版本次序。
./cli-timer 5 15 srunnet config show
./cli-timer 5 15 --rpc status.get # 仅用于 Go 后台重写期间的历史资源测量
在相同 OpenWrt 基础镜像的配对实验中,Go 候选版的完整安装增量减少 54.94%,单账号守护进程 RSS 的第 95 百分位减少 32.45%。下表是重写期间保留的测量结果,不是最终 2.0.0rc1 的重新测量,也不代表所有路由器与校园网络。
| 指标 | Python 1.6 基线 | Go 候选版 |
|---|---|---|
| 完整安装增量,含新增依赖及包数据库 | 22,724 KiB | 10,240 KiB |
| 单账号守护进程 RSS p95 | 20,784 KiB | 14,040 KiB |
| 单账号守护进程 CPU | 0.2166% | 0.1533% |
| 单账号 CPU,含已等待子进程 | 0.3400% | 0.1767% |
| 四账号守护进程 RSS p95 | 20,852 KiB | 15,652 KiB |
| 四账号守护进程 CPU | 0.4433% | 0.3350% |
| 四账号 CPU,含已等待子进程 | 0.7017% | 0.4250% |
Go 的文件描述符数量维持 7;Python 单账号为 4–10、四账号为 4–6。两版各账号都只完成一次登录,测量窗口内无重复登录、登出、凭据拒绝或 OOM。
测量方式
测量记录日期:2026-09-20。Python 来源为 9da28b5,内部版本 1.6.0_rc68;Go 来源为 1252165,内部版本 rc31。这两个测试包未作为正式版本发布。
两台独立 qcow2 虚拟机使用同一官方 OpenWrt 25.12.2 x86_64 ext4 基础镜像、相同 LuCI/CA 组件、8 个模拟认证网口、LAN 与管理接口。使用受信的原生 APK 安装。安装阶段为 256 MiB / 1 CPU;随后都以 128 MiB / 1 CPU、TCG 模式启动。
单账号和四账号场景分别预热 5 分钟,再记录 10 分钟稳定期。两版都采用 60 秒门户检测间隔、独立模拟认证网关,每 10 秒直接读取 /proc,避免反复启动应用 CLI 改变测量负载。宿主有 8 CPU,单账号和四账号实验所见最高负载分别为 1.31 和 1.34;当时另有隔离实验运行。
安装增量使用安装前后的 du -skx /:共同基础占用 24,252 KiB;安装 Python 后为 46,976 KiB,Go 后为 34,492 KiB。它包含新增运行时依赖。仅比较小体积 Python 脚本包和静态 Go 二进制会漏算 Python 运行时。
能说明什么
这些数字说明在上述环境中,Go 降低了完整安装占用与常驻进程的资源消耗。安装数据是文件系统已分配空间,不等于实际闪存压缩和擦除块占用;RSS 是守护进程的采样分位数,不是整个插件所有进程的峰值。CPU 是持续维护门户会话时的消耗,不是空账号待机功耗。
这些结果不说明游戏切网可以无缝续传,也不替代真实无线、真实校园认证、24 小时稳定性或独立审查。网口、IP 或 NAT 出口改变时,原有连接仍可能中断。
原始安装与资源采样分别归档并逐项校验,归档 SHA256:
安装:851c003e9fcb73f4ebceef3efbbbc6ab5ab4a1eb54e120d8e7bdbd762a139c96
资源:77f0f27e8dd553f597fb4f69849adab90fbf4ad9a2f69da325427b315c08f9c5新版本增加功能后应再次进行相同条件的配对实验,不能把早期数字自动当作最终发布版本的实测值。