Hasty Briefsbeta

双语

Nobody ever got fired for using a struct

3 months ago
  • #Rust
  • #Serialization
  • #Performance Optimization
  • 结构体在编程中常用于组合相关变量,但有时会导致性能问题
  • 客户报告了一个性能问题:新用例处理相似数据时,运行速度比现有管道慢很多
  • Feldera将SQL表编译为Rust结构体,每行数据转换为一个结构体。示例显示某个结构体包含数百个可选字段
  • 得益于空位优化技术,Rust的内存结构布局很高效,但序列化可能带来额外开销
  • 使用rkyv进行序列化时,归档结构体的布局效率可能降低,特别是包含大量可选字段时
  • 核心问题在于`Option<ArchivedString>`需要显式判别式,这会增加序列化数据的大小
  • 解决方案是使用位图追踪`None`字段,通过避免`Option`开销来减小序列化体积
  • 针对稀疏行数据,采用相对指针布局来完全跳过`NULL`字段,进一步优化存储
  • 该优化使问题场景中的序列化行大小减少约2倍,提升了磁盘IO和吞吐量
  • 关键结论:Rust结构体默认字段存在,而SQL表预设字段可能不存在,需要针对序列化进行专门优化