Memory64 实际上值得使用吗?

主要观点:WebAssembly 的 Memory64 提案已在 Firefox 134 和 Chrome 133 中发布,添加了 64 位指针,但 64 位 WebAssembly 在 64 位硬件上运行未必更好,反而可能更慢,这受硬件、操作系统和 WebAssembly 设计限制。
关键信息

  • 简单 WebAssembly 模块示例及修改为 Memory64 后的代码对比。
  • WebAssembly 内存实现方式,主机通过系统调用分配内存,WebAssembly 代码可读写该区域,且超出边界会陷阱,有边界检查指令增加成本。
  • 32 位和 64 位指针可使用的内存大小差异巨大,64 位设备多数实际为 48 位,浏览器为 32 位 WebAssembly 模块预留 4GB 内存可避免边界检查,而 Memory64 无法这样做,所以更慢。
  • 使用 Memory64 的唯一原因是需要超过 4GB 内存,性能 penalty 可能随引擎优化而减小,但无法消除边界检查,WebAssembly JS API 限制内存最大为 16GB。
  • 未来内存相关的可能性,如硬件更好支持边界检查、WebAssembly 的内存控制提案探索新功能等。
    重要细节
  • 介绍 WebAssembly 模块的组成部分,如内存描述、静态数据、字节码等。
  • 给出 x64 机器代码中i32.load的生成示例及相关指令的成本。
  • 说明浏览器为 32 位 WebAssembly 模块预留 4GB 内存的具体情况及相关细节,如 Guard pages 等。
  • 提及相关研究论文及代码链接以供进一步了解。
阅读 10
0 条评论