主要观点:Figma 的 multiplayer 系统处理文件加载、更新传播和文件状态快照存储,为实现实时协作,大量文件加载到内存。随着 Figma 发展,需在保留良好用户体验的同时高效扩展,发布动态页面加载后服务器端解码文件数量增加,为此在 Rust 中进行性能优化。
关键信息:
- 更小、内存高效的映射:Figma 文件用
Map<property_name (u16), property_value (u64 pointer)>
表示节点,此映射是文件加载的关键路径,占文件内存使用的 60%以上,通过测量发现平均属性映射大小约为 60 键,用更简单、内存高效的扁平排序向量替代BTreeMap
,虽性能上从理论插入时间看更差,但在反序列化文件时更快,大型文件内存使用降低约 25%。 - 通过位填充节省更多内存:
Map<u16, pointer>
中的指针实际只需 48 位,可将 16 位用于存储字段 ID,用 64 位指针表示字段 ID 和指针,通过简单位操作获取,Rust 实现中需注意引用计数,此方法在基准测试中性能稍快,内存使用略低(约比简单向量方法低 5%),但因担心潜在内存陷阱未投入生产。 - 数值下降:在 Rust 中用向量代替映射表示 Figma 文件,提高了文件加载时间(99 百分位时文件反序列化时间提高 20%,最慢的文件加载更快),节省了 20%的内存成本。Figma 一直在寻求使 multiplayer 技术更高效、性能更好、运行更简单的优化方法,欢迎查看开放职位。
重要细节:文中通过图片展示了相关数据结构和内存变化等内容,如不同表示方式的比较表、内存结构变化等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。