从C到Rust的代码移植挑战与经验教训

从C到Rust的代码移植挑战与经验教训

💡 原文英文,约800词,阅读约需3分钟。
📝

内容提要

Immunant的软件工程师Stephen Crane和Khyber Sen将VideoLAN和FFmpeg的AV1解码器从C移植到Rust,以提高安全性和性能。使用c2rust工具进行移植,解决了线程安全、内存管理和自引用结构等挑战。经过优化,性能开销从11%降至6%,最终实现了安全高效的Rust版本rav1d。

🎯

关键要点

  • Immunant的软件工程师将VideoLAN和FFmpeg的AV1解码器从C移植到Rust,以提高安全性和性能。

  • 移植使用c2rust工具,解决了线程安全、内存管理和自引用结构等挑战。

  • 选择c2rust的原因包括可以在重构时测试移植代码和减少对专家领域知识的需求。

  • 在重构Rust代码时,遇到C和Rust之间的生命周期管理、内存所有权和缓冲区指针等不匹配问题。

  • 通过使用Mutex和RwLock解决了与共享状态相关的线程安全问题。

  • 为处理多个线程对单个缓冲区的并发访问,创建了DisjointMut缓冲区包装类型。

  • 自引用结构和未标记联合的挑战通过替换指针和使用标记Rust联合得到解决。

  • 在重构过程中,监控性能回归,最终将性能开销从11%降低到6%。

  • 移植dav1d到rav1d的过程耗时超过20人月,团队由3名开发者组成,手动工作量超出预期。

  • rav1d提供了内存安全的实现,适用于安全性至关重要的应用场景,且在优化后有望与C实现竞争。

➡️

继续阅读