过去五六年里,"用Rust重写"几乎成了技术圈的一种仪式感操作------从命令行小工具到巨头公司的核心服务,隔三差五就能看到一篇"我们把XX从Python/Go/C++换成Rust"的工程博客。但这股潮流并不是无脑跟风,背后其实能梳理出三条清晰的收益曲线:冷启动快、内存占省、性能顶格。下面按这三类场景展开讲讲真实案例,最后再抽出共性规律。
🚀 场景一:追求冷启动速度
冷启动慢的本质,大多是运行时在"程序真正开始干活"之前,要先把虚拟机、解释器、JIT编译器这些重家伙启动起来。Java的JVM要加载类、Node.js要起V8引擎、Python要解析字节码------这些开销在长驻服务里感觉不到,但在无服务器函数(Serverless)、CLI工具这种"随用随起"的场景里就是硬伤。
AWS Lambda函数 是最典型的例子。业界反复测试过,用Rust写的Lambda函数冷启动时间通常在几毫秒到几十毫秒级别,而Node.js或Java的同类函数冷启动动辄要几百毫秒甚至上秒,原因很简单------Rust编译出的是一个静态链接的原生二进制文件,操作系统直接加载执行,没有虚拟机预热这一步。AWS自家用Rust开发的Firecracker微虚拟机,正是云端Serverless隔离技术的底层基石,它要解决的核心问题就是让每次函数调用的"开机时间"压缩到接近于零。
命令行工具生态 是另一个高频案例集中地。像ripgrep 、fd 、bat 、starship(终端提示符)这些工具,用户每次敲命令都要经历一次完整的程序启动到退出,哪怕只慢50毫秒,积累起来也会让人烦躁。这类工具选Rust的理由很纯粹------不需要GC初始化,不需要解释器热身,二进制直接跑。相比之下,用Python写的同类工具(比如老版本的某些git辅助脚本)启动时得先初始化整个Python运行时,体感上就是慢半拍。
工程博客和社区讨论里也反复提到,重写到Rust后"性能shot through the roof"的收益往往伴随着团队规模和维护成本的变化,这点后面规律总结部分会再提。
🧠 场景二:追求内存占用低
内存这件事,核心矛盾在于垂圾回收(GC)。Go、Java、C#这类带GC的语言,运行时会周期性地扫描堆内存、标记哪些对象还活着、回收不用的------这个过程不仅要花CPU时间,还得维持比实际数据大不少的内存冗余(GC heap headroom),否则很容易触发频繁回收甚至OOM。
Discord 的案例在Rust社区几乎被讲烂了,但确实经典。他们原本用Go实现的Read States 服务(负责追踪每个用户在每个频道里"读到哪了"),随着用户规模暴涨,LRU缓存和GC行为开始出现周期性的延迟尖刺------每隔几分钟,服务就会卡顿两分钟,这正是Go的垂圾回收在大堆场景下的典型症状。换成Rust之后,由于内存管理依靠所有权(ownership) 和 借用检查(borrow checker) 在编译期完成,运行时完全没有GC这一步,内存使用曲线变得平滑可预测,延迟尖刺也随之消失。
社区里对Go和Rust的内存稳定性做过不少压测对比,结论比较一致------Rust因为没有GC的stop-the-world停顿,在长时间高负载下内存曲线更稳,Go则会随着对象分配速率上升出现周期性的内存抖动和延迟波动。
另外一类内存敏感场景是 嵌入式和资源受限设备 。像uutils这种用Rust重写Unix核心工具集(ls、cp、cat等)的项目,目标之一就是在资源紧张的环境(比如嵌入式Linux、容器基础镜像)里把内存footprint压到最低,同时保持内存安全------这也是为什么近几年Linux内核开始允许用Rust写驱动模块,安全和省内存是同一枚硬币的两面。
⚡ 场景三:追求极致高性能
这一类是最容易出圈的,因为性能数字摆在那里特别有说服力。
Cloudflare 在2024年公开了用Rust重写的反向代理Pingora,用来替代长期服役的Nginx,目标直指极限吞吐和尾延迟(tail latency)。Nginx本身已经是C语言里公认的高性能标杆了,Cloudflare选择再上一层Rust而不是继续优化C配置,一个重要原因是Rust能在不牺牲性能的前提下消除C/C++里常见的内存越界、悬垂指针这类问题------相当于用编译器把一整类bug提前杀死,同时还能拿到和C相当甚至更好的运行效率。
前端工具链 是另一个性能战场。Babel、ESLint、Prettier这些老牌JavaScript工具都是用JS写的,解析和转换大型代码库时慢得让人崩溃。于是出现了SWC 、oxc 、Turbopack 、Rspack这一批用Rust重写的替代品,普遍能把编译/打包速度提升到原来的10到20倍。核心原因在于JS引擎(即便是V8)本身要承担动态类型检查、JIT预热、GC这些开销,而Rust代码编译成机器码后直接跑在裸金属上,没有这层税。
企业级重写方面,Dropbox早年把同步引擎的核心模块从Python迁移到Rust,CPU占用和内存都大幅下降,这也是为什么桌面同步客户端能支持更大规模的文件树而不卡死。1Password也把跨平台的核心加密逻辑统一用Rust实现,一套代码跑在Windows、macOS、iOS、Android上,既保证了性能一致性,也避免了多语言实现之间逻辑漂移导致的安全漏洞。
当然,社区里也有不少反思的声音------有人把"全公司大张旗鼓重写成Rust"调侃为十亿美元的时间浪费,认为很多团队低估了重写过程中的性能回退期和巨大的人力投入,收益被夸大了。这种声音值得放进整体判断里,不是每次重写都划算。
📊 案例速览表
| 场景类别 | 代表案例 | 原语言 | 核心收益 |
|---|---|---|---|
| 冷启动 | AWS Lambda / Firecracker | Node.js / Python / C | 启动时间从百毫秒级降到个位数毫秒 |
| 冷启动 | ripgrep / starship 等CLI工具 | Python / Shell | 零虚拟机预热,即起即用 |
| 内存占用 | Discord Read States服务 | Go | 消除GC停顿,内存曲线平滑 |
| 内存占用 | uutils / 嵌入式驱动 | C / Shell | 更低footprint + 内存安全 |
| 高性能 | Cloudflare Pingora | C (Nginx) | 极限吞吐 + 消除内存安全类bug |
| 高性能 | SWC / Turbopack / oxc | JavaScript | 构建速度提升10-20倍 |
| 争议反思 | 大规模重写的隐性成本 | 多语言 | 人力投入与性能回退期被低估 |
🧭 共性规律:什么样的程序最该用Rust重写
把这些案例摆在一起看,能抽出几条很扎实的规律。
瓶颈必须是语言运行时本身,而不是业务逻辑设计。 如果一个服务慢是因为SQL查询设计得差、架构有问题,换Rust也救不回来------Discord重写的前提是他们已经确认瓶颈是Go的GC行为,而不是代码逻辑。
调用频率极高或规模极大,边际收益会被放大。 CLI工具每天被成千上万人调用无数次,Lambda函数每天触发百万级,这种"长尾叠加"场景下,哪怕单次只省几毫秒,汇总起来也是巨大的用户体感和云账单差异。
尾延迟敏感的系统收益最明显。 GC类语言的平均延迟可能不差,但P99甚至P999延迟容易因为GC停顿而失控------这正是Discord案例里"每隔几分钟卡两分钟"的根本原因,也是Cloudflare选择Rust做反向代理的核心诉求。
可以用这个图简单表达这个决策逻辑:

最后一条规律稍微反直觉一点------组件边界清晰、可以独立替换的模块最适合试点重写,而不是一上来就推翻整个系统。Discord、Dropbox、Cloudflare的案例无一例外都是先挑一个边界清晰的服务或模块练手,验证收益之后再逐步扩大范围,而不是搞"一次性大爆炸式"重写。那篇批评"亿万美元浪费时间"的文章,恰恰指出的问题就是有些团队跳过了这个验证步骤,直接All in,结果重写周期拖得比预期长得多,业务迭代反而被拖慢。
说到底,Rust重写不是信仰问题,是一道实打实的工程成本收益计算题------运行时开销 Cruntime 能不能被重写收益 Bperf 覆盖掉重写本身的人力投入 Crewrite,也就是看
Bperf>Crewrite+Cmaintenance
这个不等式能不能成立,才是真正该问的问题。
参考资料
Speed up Your Code by Refactoring to Rust --- www.infoq.com/presentatio...
The Rust Rewrite Removed 4 Bugs and 6 Engineers --- codingplainenglish.medium.com/the-rust-re...
Rust Rewrite Becoming Billion-Dollar Waste of Time --- www.linkedin.com/posts/guyko...
High-Performance Automotive Software Development with Rust --- www.acsiatech.com/insights/ru...
I Rewrote Our Slowest Service In Rust --- medium.com/@build_brea...
r/golang discussion on Go GC vs Rust ownership --- www.reddit.com/r/golang/co...
Go vs Rust Load Testing: Requests per Second vs Memory Stability --- medium.com/@harishsing...
The Go Feature That Kills GC Pauses and Rivals Rust's Speed --- medium.com/@monikasing...
How Discord Used This Rust "Hack" to Outperform Every Other Chat Platform --- medium.com/@theopinion...
A look at how Discord uses Rust for their data services (r/rust) --- www.reddit.com/r/rust/comm...
Why Discord is switching from Go to Rust --- refind.com/links/53086...
Hacker News discussion: Why Discord is switching from Go to Rust (2020) --- news.ycombinator.com/item?id=373...