🛠️ Campfire 被重写了八遍:C 反超 Rust 那天,跑分表换了问题
先看一张表。同一款开源聊天应用 ONCE Campfire,同一个「房间页」,同样 16 个并发客户端、同一台 Ryzen AI MAX+ 395、每个应用分 4 个核心,每秒能处理的请求数:Rails 4101,Django 1507,Laravel 3872,Express 42636,Elixir 5350,Go 53060,Rust 106494,C 137524。
这份表格这几天在程序员圈子里刷了屏。事情的主人公 DHH 是 Ruby on Rails 的作者,他让 AI 智能体把自己的聊天产品 Campfire 从 Rails 重写成 Rust,接着又加了 Elixir、Go,最后连 C 都来了,八个语言各养着一个仓库。Rust 版的 README 写得很克制:一个 campfire 可执行文件,替换掉 Ruby、Puma、Redis、Resque 和 Thruster 五件套,直接读原来那份数据库,老用户升级不用迁移。官方口径是快 19 到 44 倍。
我手算了一下最显眼那格:106494 除以 4101,约 26 倍,落在 19 到 44 之间,没吹牛。
故事在这里拐了个弯。10 月 7 日,表格里 Rails 房间页的成绩是每秒 230 次。第二天它变成 4101 次。18 倍。语言没换,框架没换,连机器都没换。变的是 DHH 把最快端口的架构改进反向搬进了每个实现——他的原话是「我让 clanker 跑一天,然后让它把所有架构改进带给每个实现」。又过一天,C 超过了 Rust,他发了句「好老 C 现在领先了」。
这张表测的,从来就不只是语言。
把表格拆开的人叫 Piotr Sarnacki,10 月 11 日发的长文在 Hacker News 拿了三百多个赞。他数出三层问题。
第一层,提示词没写的决定,智能体替你掷硬币。要不要保持向后兼容、崩溃后丢不丢通知、偏向延迟还是吞吐——这些问题没有唯一正确答案。Rust 版为了缓存方便丢掉了 CSRF token,把 Redis 换成了进程内队列;Elixir 版却几乎贴着原版写。跨语言的对比从这里就开始失真了,毕竟没有哪个编译器会因为语言特性去决定兼容性。
第二层,异步正确性没人验货。Rust 的调度是协作式的,一个任务不主动让出,整个线程干等。Rust 版里有 SQL 查询以阻塞方式跑在异步任务里,还有同步锁一拿就是十毫秒——锁住的这一线程上所有任务陪着静止。Elixir 版也挨了骂,单个进程串行处理全部 SQL,连只读查询都排着队。两边都有伤,只是伤的位置不同。
第三层最疼。有人(Zach Daniels)压测了重负载下的消息通知送达率:Rust 版发出的六七千条通知只送到了百分之一;同一场景 Elixir 版约一千七百条全部送达。Elixir 社区欢呼「BEAM 并发天下第一」,Sarnacki 泼了冷水——这组对比里两边压的请求数都不一样,Rust 撑住了六七千的负载然后崩了送达,Elixir 在一千七就靠背压稳住了。闭环压测测的是「你多快」,恒定速率压测测的才是「你多稳」,两个问题共用一张表,就是事故。
10 月 9 日又来了个补刀的。一位开发者用 Claude Code 花约一天,把 Rust 版移植成了 Kotlin,跑在 JVM 上,连 Rust 版内嵌的 HTML 解析器都按 658 个测试用例逐字节对齐。结果在 x86 上和 Rust 打平、互有领先。JVM 压根不在 DHH 的表上——补上了,榜就又变了。
这张表最后告诉我的是:智能体把「打字」的成本打到了地板上,把「决定」的成本原封不动留在原地。DHH 的实验真正展示的,也许既非 Rust 的胜利,也非智能体的胜利,而是一件事——当写代码不要钱之后,跑分表里每一格都值得问一句:这是语言快,还是你偏心。
仓库在 github.com/basecamp/once-campfire-rust,八个实现都在 basecamp 组织下,自己上手压一遍比信谁都强。
讨论回复
加载中...正在加载回复...
推荐
智谱 GLM-5 已上线
我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。