Chrome 中的 IndexedDB 存储更高效

Chrome 中新增了一项优化,可改进 IndexedDB 数据在磁盘上的存储方式。此增强功能重点关注如何在 Chrome 的存储系统中管理大型值,具体方法是针对存储在磁盘上的某些文件引入压缩功能。本文总结了此次更新的要点。

Chrome 129 之前的存储机制

Chrome 使用 LevelDB 在磁盘上存储 IndexedDB 数据。LevelDB 是一个快速的键值对存储库,但当单个值超出数据库页面大小时,它会遇到问题。为解决此问题,自 2017 年起,Chrome 会将大于单个页面的值作为纯文件存储在磁盘上,与数据库文件一起存储。

129 版中的存储

对大值进行压缩

与直接存储在 LevelDB 数据库中的内容不同(这些内容会在写入磁盘之前压缩,并在读取后解压缩),存储为普通文件的大型文件不会压缩。在此次更新后,Chrome 现在会使用 Snappy 实时压缩库压缩这些大型文件,从而显著节省空间。这对于结构化数据(例如 JavaScript 值、XML 或 JSON 的大型数组)尤为有效。但对于大小较大但已压缩的媒体文件,或网站已自行压缩和解压缩的媒体文件(这种情况较少见),此方法不太有效。

对存储效率的影响

如果压缩后文件大小小于 LevelDB 页面大小,系统会将数据移回 LevelDB。这项更改不仅可以节省空间,还可以减少磁盘 I/O 操作,从而提升整体性能。

Snappy 压缩算法

Chrome 团队选择了 Snappy 进行压缩,因为它会针对速度进行优化,而不是针对最大压缩率进行优化。该算法速度足够快,在压缩或解压缩过程中不会造成任何可衡量的性能损失。

提升了性能

压缩和解压缩是在渲染程序进程中处理的,该进程是 Chrome 多进程架构的一部分。这会缩减发送到浏览器进程的消息大小,从而进一步提升性能。合成基准测试表明,由于减少了 IPC(进程间通信)和磁盘 I/O,此更新可使某些操作的速度提高 2 到 3 倍。在实践中,根据 Chrome 团队的测算,1 MB 的结构化数据载荷从磁盘传送到网页的时间大约缩短了四分之一(具体时间因设备硬件和系统活动而异)。

对开发者和用户的影响

这些更改对开发者和用户都是完全透明的。不过,用户可能会发现性能有所提升,存储空间用量有所减少。

  • 节省空间:压缩仅适用于在此更新后存储的新数据。您可以使用 navigator.storage.estimate() 等 Web API 间接观察节省的空间,也可以在 Chrome DevTools 的 Application 面板下方的 Storage 部分中查看。
  • 测试该功能:开发者可以使用标志 --enable-features="IndexedDBCompressValuesWithSnappy" 在 Chrome 的预发布版本(129 之前的版本)中启用此功能,以便测试此行为。

此更新提高了 Chrome 管理大型 IndexedDB 值的效率,在不影响性能的情况下节省了空间和时间,从而显著改进了在浏览器中存储和访问数据的方式。了解这些变化后,开发者可以从 Chrome 不断优化的性能和存储机制中受益,从而确保用户获得更流畅、更高效的体验。

致谢

本文档由 Evan StadeRachel Andrew 审核。