< 返回版块

Bigfish 发表于 2026-11-08 23:42

这台机器上装了 5 个编码 Agent。同一个动作,打印版本号:rpi 11.1 ms、claude 17.2 ms、codex 33.8 ms、Pi 151.2 ms、opencode 867.0 ms。

装到磁盘上的东西差得更多:rpi 的 Windows 发布包 14.35 MiB,claude 一个可执行文件 231 MB,codex 284 MiB,opencode 172 MiB,Pi 是 384.9 MiB 的包外加 91.2 MiB 的 Node。

最慢和最快差 78 倍,最大和最小差 27 倍。这不是谁调优得更好一点,是构造不同:rpi 是一个不带运行时的 Rust 二进制,另外几个要么自带 Node/Bun 运行时,要么拖着上百兆的依赖树。

先看表,再说条件

工具 启动(--version 中位,15 次) 装到磁盘上的体积 实现
rpi 11.1 ms 14.35 MiB(发布包) Rust 单二进制
claude 17.2 ms 231.0 MB 单可执行文件
codex 33.8 ms 284.4 MiB 单可执行文件
Pi 151.2 ms 384.9 MiB 包 + Node 91.2 MiB TypeScript / Node
opencode 867.0 ms 172.2 MiB 单可执行文件
仅 node --version 19.4 ms Node 91.2 MiB 运行时的地板

条件:同一台机器(Windows 11,Ryzen 9 7950X,32 逻辑处理器),每个工具跑 15 次取中位数。rpi 和 Pi 都用离线开关并指向独立的空配置目录,避免加载本机插件。claude、codex、opencode 按安装后的默认行为跑,它们没有对应的离线开关。体积是发布包或已安装可执行文件的实际大小;rpi 那一栏是 zip 发布包,解压出的二进制会比它大一些。

启动耗时:rpi 11.1 ms 最短,opencode 867.0 ms 最长

磁盘体积:rpi 14.35 MiB,其余四个在 172–385 MiB,Pi 还要再加 91.2 MiB 的 Node

图 1 和图 2 把同一张表画成条形。看启动那张时注意 node 那一根:单是启动运行时就要 19.4 ms,任何 Node 系工具都不可能比它更快。看体积那张时注意 Pi 的两段颜色,工具本体之外还要单算一份 Node 运行时。

--version 只测进程创建到打印版本,不含任何模型请求。它衡量的正是你每次敲命令、每次被编辑器拉起都要付的那笔启动成本。我这 15 次落在 10.4 ms 到 17.3 ms 之间,你重跑很可能得到 12–13 ms,属同一量级。同一台机器上单独跑 node --version 就要 19.4 ms,这是任何 Node 系工具起跑线的地板。

需要说清一处:启动这一项 rpi 是五个里最快的,但比 claude 只快 6 ms,差距远没有体积那么大。真正拉开数量级的是体积(14 MiB 对 231–385 MB)和内存,下一节说内存。

内存:地板 12 MiB,空闲 1 MB 出头

官方离线基准里,rpi 空配置刚就绪的常驻内存是 12.0 MiB,同机对照的 Pi 是 91.5 MiB,冷启动快 10.7 倍(Windows 11、release、离线、每次用新的空配置目录,基准版本 rpi 0.3.6 / pi 0.87.1)。

我自己这台机器上的快照是另一个尺度。31 个 rpi.exe 里,11 个闲置会话的驻留内存只有 1.12 MB 到 1.67 MB,加起来 16.2 MB。10 个正在跑会话的进程在 33.28 MB 到 111.91 MB 之间,中位 48.3 MB。4 个给编辑器用的宿主进程中位 87.1 MB。

同一父进程下 14 个会话进程:11 个闲置的驻留只有 1 MB 出头,3 个在工作的在 45–143 MB

图 3 是同一批进程的对照:14 个会话进程挂在同一个父进程下,闲下来的 11 个驻留贴到 1 MB 线,还在干活的 3 个是 45.67 MB、118.99 MB 和 143.07 MB。同一份程序,差别只在有没有活在跑。会话状态逐帧写进 JSONL,进程安静时没有请求在跑,驻留页就能被系统换出去。

12 MiB 和 48 MB 并不矛盾:前者是空配置刚能应答的地板,后者是带着扩展、跑过多轮工具调用、留着会话历史的真实工作进程。地板决定你能不能把它塞进小机器,后者决定你干活时要付多少。

这三个数字能换来什么

容器和 CI 里不用再铺运行时

一个 14 MiB 的二进制丢进镜像就能跑,不用为了一个 Agent 在镜像里装一层 Node 和一份 node_modules。空配置就绪 12 MiB,512 MB 的容器留得下。

多开会话不心疼

一个会话一个进程,闲下来驻留掉到 1 MB 级,11 个这样的实例加起来 16.2 MB;关掉一个立刻还回去。按我这台机器的中位数估,10 个活跃会话加 4 个宿主约 830 MB,剩下的就是闲置的那几个,它们几乎不占物理内存。

每次调用 11 毫秒

编辑器每拉起一次、脚本里每循环一次、CI 每个 job 都要启动一次。按一天 300 次算,rpi 是 3.3 秒,Pi 是 45.4 秒。次数越多,这个差距越明显,而且它不需要你改任何配置。

为什么能这么小

一是没有运行时。Rust 直接编成机器码,不需要 Node 或 Bun 陪着一起启动,那 19.4 ms 的地板和 91.2 MiB 的运行时都不存在。

二是不带依赖树。扩展是独立的 cdylib,用到才加载;Pi 那种 384.9 MiB 的目录,是把它所有可能用到的依赖都先装到磁盘上。

三是会话不常驻内存。会话状态逐帧写进 JSONL 文件,进程闲下来时可以被系统换出,这就是那 11 个 1 MB 会话的来历。它的代价写在后面。

自己验一遍

rpi 发布的是单个二进制,v0.21.1 的 Windows 包 14.35 MiB、macOS arm64 包 13.40 MiB、Linux gnu 包 14.70 MiB(GitHub release 元数据,2026-11-07),不需要 Node 运行时:

cargo install rpi-cli
rpi --version

不想装 Rust 工具链就用预编译安装脚本:

curl -fsSL https://raw.githubusercontent.com/bigfish1913/pi-rust/main/scripts/install.sh | sh

装好后你可以照着上面的表自己量一遍:

# 启动:连跑 15 次取中位
$t = 1..15 | ForEach-Object {
  $sw = [Diagnostics.Stopwatch]::StartNew()
  & rpi --version | Out-Null
  $sw.Stop(); $sw.Elapsed.TotalMilliseconds
}
($t | Sort-Object)[7]

# 内存:开几个会话后看驻留与提交
Get-Process | Where-Object { $_.ProcessName -eq 'rpi' } |
  Select-Object Id,
    @{n='WS_MB'; e={[math]::Round($_.WorkingSet64/1MB, 1)}},
    @{n='Priv_MB'; e={[math]::Round($_.PrivateMemorySize64/1MB, 1)}} |
  Sort-Object WS_MB -Descending

11 毫秒、14 MiB、12 MiB 就绪、1 MB 空闲:四个数字都在上面,也都能在你自己的机器上重跑一遍。



Ext Link: https://rpi.bigfisharc.cn/

评论区

写评论

还没有评论

1 共 0 条评论, 1 页