内容提要
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测试套件)。