为什么你不应该忘记优化数据布局

主要观点:程序的底层数据布局对算法性能有重要影响,需考虑数据布局以实现最佳性能。
关键信息

  • 数据布局影响 CPU 缓存使用、缓存未命中次数和向量指令利用,进而影响性能。
  • 存储对象集合有 AoS(Array of Structures,结构数组)和 SoA(Structure of Arrays,数组结构)两种方式,AoS 方便按对象访问,SoA 便于按字段访问。
  • 不同数据布局在更新和读取性能上表现不同,SoA 在读取性能上比 AoS 快约 3 倍,自动向量化后可快 4 倍以上。
  • 轻量级压缩适用于 SoA 布局,可检测模式和重复值,减少数据移动,提高性能。
  • 对于大数据集,分块结构的 SoA 可处理内存外数据,提高效率。
  • 在数据库系统中,传统系统多采用 AoS,现代分析系统倾向于 SoA,CedarDB 采用混合存储引擎 Colibri 结合两者优势。
    重要细节
  • 实验中用 100 万条记录,在 i7 - 13700H CPU 上测试,更新 10%员工数据时,AoS 执行时间 126.58ms,SoA 为 195.66ms;读取时,AoS 执行时间 137.22ms,SoA 为 45.67ms,自动向量化后 SoA 为 33.13ms。
  • 轻量级压缩如帧参考编码在 SoA 布局中效果更好,可减少数据移动,提高性能,如测试中 SoA 压缩后执行时间为 19.52ms,节省 33%内存。
  • 完整代码展示了 AoS 与 SoA 的对比测试及各种操作的实现,包括创建数据结构、计算总薪资、更新数据等。
阅读 10
0 条评论