Rust 重写 Pi:会话启动耗时降 91%,就绪内存少 78%

2,049 字#Rust #Agent #Pi #rpi #性能 #基准测试

同样打开一个带有 100 条历史消息的 Agent 会话,rpi 用了 16.9 毫秒,Pi 用了 194.9 毫秒。

等到程序就绪,rpi 的进程驻留内存是 21.4 MiB,Pi 是 96.1 MiB。

换成比例,Rust 版 rpi 的会话启动耗时少约 91%,就绪内存少约 78%。把历史增加到 5,000 条,rpi 在这两项上依然领先。

rpi 是用 Rust 重新实现的 Pi 编码助手,既能作为终端工具运行,也能作为库进入 Rust 应用。这篇只看它已经拿到明确收益的两个环节:打开已有会话,需要等多久;打开以后,占用多少内存。

下面的数据来自 2026 年 10 月 6 日保存的基准,对比 rpi 0.3.15 与 Pi 0.87.1。本次重新核对原始记录与统计结果,没有重跑当前版本。

会话启动:16.9 毫秒对 194.9 毫秒

只测 --version,能看到程序启动得有多快,却没有让 Agent 真正加载会话。

当时的测试给两边准备相同的历史文本,用各自的原生会话格式保存。启动程序后,发出 get_state 状态请求,收到响应才停止计时。计时器放在创建进程之前,因此包含进程创建和会话重载。

历史消息数rpi 启动至就绪Pi 启动至就绪rpi 耗时减少
10016.93 ms194.93 ms91.3%
1,00028.85 ms196.98 ms85.4%
5,00081.60 ms212.47 ms61.6%

每端每种规模丢弃 2 次预热,正式测量 5 次,表中取中位数。降幅根据未舍入的中位数计算。

100 条消息时,Pi 的就绪耗时约为 rpi 的 11.5 倍。增加到 1,000 条,rpi 仍在 30 毫秒以内,Pi 约为 197 毫秒。

三种历史消息规模下,rpi 与 Pi 的会话启动至就绪耗时;rpi 三档均更低

条形表示 5 次测量的中位数,散点保留各次实测;横轴从零开始,越短越好。双方使用独立测试配置,不加载扩展。

5,000 条消息是更有价值的对照。此时两边都需要读取和处理更多历史,rpi 的启动至就绪时间为 81.6 毫秒,Pi 为 212.5 毫秒,rpi 仍少用约 131 毫秒。

这说明收益不只存在于一条轻量版本命令里。至少在这三档文本会话中,rpi 都能更快进入可响应状态。

脚本还做了额外核验:检查加载的会话标识,随后发送新消息,核对模型端收到的历史数量和尾部标记,避免把没有真正加载历史的空会话当成成绩。

就绪内存:21.4 MiB 对 96.1 MiB

启动耗时决定需要等多久,内存则影响程序放在那里要付出多少资源。

为避免采样命令干扰计时,内存测试另起进程。加载同一份会话并就绪后,再读取进程 RSS,也就是当时驻留在物理内存中的大小。

历史消息数rpi 就绪 RSSPi 就绪 RSSrpi RSS 减少
10021.41 MiB96.15 MiB77.7%
1,00027.33 MiB98.04 MiB72.1%
5,00050.85 MiB116.77 MiB56.5%

RSS 每端每种规模单独采样一次,是就绪时的观察值,不是运行峰值。

100 条消息时,rpi 的就绪 RSS 约为 Pi 的 22.3%。加载到 1,000 条时,rpi 仍只有约 27.3 MiB。

三种历史消息规模下,rpi 与 Pi 的就绪 RSS;rpi 分别减少约 77.7%、72.1% 和 56.5%

图中为各组单次就绪采样,没有误差区间。RSS 不等于堆大小,也不代表完整任务所需的最大内存。

到 5,000 条消息时,rpi 与 Pi 相差约 65.9 MiB。历史增长以后,rpi 的资源优势仍然存在,没有因为加载更多消息就消失。

如果应用需要同时运行多个独立 Agent 进程,这类差额就有继续验证的价值。下一步应看目标并发数下的总内存,以及真实任务执行时的峰值,确认能多承载多少工作。

对使用者,这两项优势分别意味着什么

对于经常启动、退出,或者由上层程序按需拉起的 Agent,会话启动成本会反复出现。100 条消息这组约 178 毫秒的差额,每次重新启动并加载同类会话时,都可能影响等待体验。

对于多个 Agent 进程同时存在的应用,单个进程的资源占用更值得关注。这里测到的就绪 RSS 差额,为进一步做并发容量测试提供了依据,但不能直接乘以进程数量当成实际节省量。

rpi 还有一个与项目设计直接相关的用途:作为库接进 Rust 程序。已有的模型接入、工具循环与会话能力,可以由应用按需组合。对于本来就在 Rust 技术栈里开发产品的人,这也是评估它的一个理由。

这篇比较的是两套实现,不把差额全部归因给某一种语言机制。没有 CPU 和分配剖析,就无法准确拆出依赖初始化、历史解析、运行时和对象布局各占多少。

但作为一次工程结果,三档会话给出的方向一致:这组版本中,rpi 打开会话更快,就绪时也更省内存。

怎么测的,哪些条件需要保留

原始记录的平台为 Windows,系统标识为 build 26300,Node 为 v25.9.0。双方使用独立测试配置和专用工作目录,不加载扩展。

历史消息由用户与助手交替组成,每条正文约 1,000 个字符。双方逻辑文本相同,原生 JSONL 文件和协议请求体并非逐字节相同。每轮启动前恢复原始样本,操作系统文件缓存没有清空,所以这里比较的是缓存已预热后的表现。

会话样本只有已完成的文本对话,没有图片、上下文压缩和中断恢复。上述成绩也不包含真实模型生成,不能换算为完成编码任务的加速比例。两端按固定顺序分组测量,没有随机交替,仍值得在更多机器上复测。

标题中的 91% 和 78% 对应 100 条消息这一档,分别是启动至就绪的耗时降幅,以及就绪 RSS 的降幅;其他规模的结果完整保留在前面的表格里。

原始数据:

https://blog.bigfisharc.cn/benchmarks/rpi-pi-runtime-20261006.json

测试脚本:

https://blog.bigfisharc.cn/benchmarks/bench-rpi-pi-runtime.py

下载脚本,准备上述历史版本,把变量替换为实际路径后,可以复测这三档会话:

$benchRpi = 'C:/bench/rpi.exe'
$benchPi = 'C:/bench/pi/dist/bundle/cli.js'
$benchNode = 'C:/Program Files/nodejs/node.exe'

python bench-rpi-pi-runtime.py --rpi $benchRpi --pi $benchPi --node $benchNode --output session-results.json --runs 5 --warmup 2 --sizes 100,1000,5000 --turns 0

原始 JSON 未保存完整硬件信息与两端源码提交 SHA。这条命令提供方法复现入口,不保证重现相同数字。当前版本的结果需要另外运行、记录,再与这批历史数据比较。


云服务器推荐

如果你需要部署博客、Docker 服务或个人项目,可以参考:

本文包含推广链接。通过链接购买不会增加你的费用,但我可能获得少量佣金。

评论