1. Google Sheets ported its calculation worker from JavaScript to WasmGC (web.dev)
Google Sheets 计算引擎从 JavaScript 迁移至 WasmGC 的实践与优化
Google Sheets 作为首批在 Chrome 中采用 WasmGC(WebAssembly 垃圾回收扩展)的产品之一,与 Chrome 团队紧密合作,完成了其计算引擎从 JavaScript 到 WasmGC 的迁移,旨在大幅提升计算性能。
背景与挑战
- 历史:计算引擎最初用 Java 编写(2006年),早期在服务器运行。自2013年起,通过 GWT 和后来的 J2CL 工具链,将其转译为 JavaScript 以在浏览器中的 Web Worker 内运行。
- 性能问题:经过验证,JavaScript 版本的计算引擎比原生 Java 版本慢三倍以上。这主要归因于 JavaScript 的动态类型特性,使得即时编译器(JIT)难以生成最优机器码。对于大型试算表,计算延迟显著。
解决方案:WasmGC
WasmGC 是 WebAssembly 规范的扩展,新增了编译垃圾回收语言(如 Java)所需的基础指令。其目标是为这类语言提供接近原生的网络运行性能,类似于 WebAssembly 为 C++ 所做的。
合作开发与实施
- 团队协作:2020年底,Google Workspace 与 Chrome 团队启动合作。Workspace 团队拥有编译器优化经验,Chrome 的 V8 团队负责运行时,双方共同构建工具链。Google Sheets 因其对性能的高要求和完善的验证机制,成为理想的测试平台。
- 原型开发:2021年中,Java 到 WasmGC 的编译器可用;同年底,成功以 WasmGC 形式运行 Sheets 计算引擎。初期面临工具缺失、需寻找或编写替代 JavaScript 库、以及验证正确性等挑战。
关键优化策略
初始 WasmGC 版本比 JavaScript 版本慢约两倍,团队随后实施了多轮优化:
- 移植已有最佳化:将 JVM 和 V8 中成熟优化移植至 WasmGC。例如,实现虚方法调用的推测内联和去虚拟化,使 Chrome 上的计算时间缩短了约 40%。
- 利用高性能浏览器 API:在特定场景(如字符串和正则表达式)直接使用原生优化的浏览器 API。将正则表达式处理从编译为 WasmGC 的 re2j 库切换至 Chrome 原生
RegExpAPI 后,速度提升近 100 倍。 - 重构平台特化代码:移除过度适应 JavaScript 特性的代码模式。例如,重写了一个核心数据结构,该结构在 JavaScript 中高效(因稀疏数组自动作为映射处理),但在其他平台上效率低下。
最终成果
经过一系列优化,最终的 WasmGC 版 Sheets 计算引擎性能比 JavaScript 版本快约两倍,相较于未优化的初始 WasmGC 版本,性能提升达四倍。
结论与展望
此次迁移证明了 WasmGC 是一项强大技术,能有效提升 Web 应用性能。Google 预计 WasmGC 将在未来支持共享内存多线程并进一步提升单线程性能,建议开发者在高性能 Web 项目中考虑使用 WasmGC,以打造更流畅的网络体验。