Rust重写运动,到底是真香还是被吹爆?

Rust重写运动,到底是真香还是被吹爆?

💡 原文中文,约5900字,阅读约需15分钟。
📝

内容提要

Rust重写运动自2022年兴起,虽带来性能提升(如uutils排序快4倍),但并非总是更快,且存在二进制体积大、新bug、工期低估等问题。Linux和Windows内核接纳Rust是最大成功,但部分项目如Prisma、LogLog选择放弃。重写需权衡利弊,优先考虑扩展而非整体重写,并准备测试套件。

🔎

延伸解读

性能提升并非必然

演讲中的实测数据显示,Rust重写并非总是更快。例如,uutils的sort因并行处理提速近4倍,PNG解码库因SIMD自动向量化和流式解压快近2倍,但bat在非交互模式下比cat慢60倍,lsd因系统调用增多而变慢。这说明性能提升依赖于具体场景和实现,不能一概而论。

重写需权衡隐藏成本

重写不仅耗时,还容易引入新bug。演讲列举了Cloudflare、sudo-rs、Linux binder驱动等案例,说明即使是大项目也会犯错。此外,学习曲线和工期常被低估,实际耗时往往是预估的2到3倍。因此,在决定重写前,需充分评估团队能力和项目需求。

并非所有项目都适合Rust

微软TypeScript编译器选择Go而非Rust,Prisma回归TypeScript,LogLog因迭代速度慢而放弃Rust,Hyper与Curl的集成也最终失败。这些案例表明,Rust并非万能,需根据项目特点选择合适语言。例如,游戏开发中大量对象相互引用,借用检查器反而成为障碍。

重写前的实用建议

演讲者建议,若决定重写,应优先考虑扩展而非整体重写,并准备扎实的测试套件以确保行为一致。uutils复用GNU coreutils的测试套件,实现了接近100%的行为对齐。同时,需提前确认团队是否懂Rust、编译器是否支持目标平台,以及二进制体积是否可接受。

Q&A

Rust重写运动是什么时候兴起的?

Rust重写运动大约从2022年前后兴起,与Rust 2021 edition发布的时间相近。

Rust重写项目主要分为哪几类?

Rust重写项目主要分为三类:drop-in替代(完全兼容原有二进制)、平行替代品(解决同样问题但思路不同)、自我重写(项目内部用Rust重写部分或全部代码)。

Rust重写带来性能提升的典型案例有哪些?

uutils的sort比GNU coreutils快近4倍,PNG解码库比对应C库快近2倍。

Rust重写是否总是更快?

不是。例如bat在非交互模式下比cat慢60倍,lsd因系统调用暴增而变慢。

Rust二进制体积大的问题如何解决?

可以使用multi-call binary技巧,将多个工具打包进一个可执行文件,uutils通过此方法将体积从73MB压缩到14MB。

Rust重写会带来哪些隐藏代价?

隐藏代价包括:新bug的引入(如Cloudflare、sudo-rs等案例)、学习曲线陡峭、工期低估(实际耗时往往是预估的2到3倍)。

有哪些项目放弃了Rust重写?

微软TypeScript编译器选择了Go,Prisma回归TypeScript,LogLog工作室放弃Rust,Hyper与Curl的集成被放弃。

重写时许可证选择有什么影响?

如果换成限制更多的许可证(如GPL),可能让部分用户望而却步;换成更宽松的许可证,可能招致“大公司白嫖代码”的批评。

什么情况下值得考虑用Rust重写?

如果项目使用内存不安全语言编写,属于关键性软件,对性能和可靠性有明确要求,且有大量并行代码,则值得考虑。

决定用Rust重写后有哪些建议?

建议包括:先确认值得做(团队技能、平台支持、二进制体积)、优先考虑扩展而非整体重写、准备扎实的测试套件(如uutils复用GNU coreutils测试套件)。

🏷️

标签

➡️

继续阅读