在最近的一则推文中,计算机科学家 Daniel Lemire 指出,JavaScript 运行时 Bun 在解码 Base64 输入时,比 Node.js 22 快了数倍。尽管两者都依赖于同一个底层库 simdutf 来进行实际解码,但 Node.js 在与其底层 JavaScript 引擎 v8 交互时遇到了瓶颈。
Lemire 详细解释了问题的根源在于 Node.js 在开始解码字符串之前,需要通过调用 String::Value
函数来获取字符串的值。这一步操作会在 Node.js 内部分配一个数组,并要求 v8 将内容复制到这个数组中。由于无法直接访问 v8 中存储的字符串,Node.js 被迫将纯 ASCII 字符串转换为 UTF-16,导致了不必要的性能损失。
Lemire 的分析显示,Base64 解码过程仅占总运行时间的五分之一,而字符复制过程则占据了将近一半的时间。这种多余的转换不仅浪费了资源,还使得整个解码过程效率低下。
与此同时,Bun 通过不同的架构设计,避免了这些性能瓶颈。Bun 使用了 JavaScriptCore 引擎,并通过优化字符串处理路径,直接处理 8-bit 输入,避免了不必要的 UTF-16 转换。这样的设计使得 Bun 能够在 Base64 解码等操作中显著领先于 Node.js。
这则消息在开发者社区引发了广泛讨论。有开发者在 HackerNews 上分享了他们对 Bun 的使用体验,称其在速度和文档方面都表现出色,并推荐其他开发者尝试使用 Bun。尽管 Bun 仍然存在一些 API 和行为上的差异,但其性能优势和良好的开发体验使其成为 Node.js 的一个有力竞争者。
Bun 的开发团队也在不断努力,通过阅读和优化 JavaScriptCore 的代码,致力于提升 Bun 的性能和兼容性。Lemire 的分析不仅揭示了 Node.js 在性能优化上的挑战,也为 Bun 的发展提供了宝贵的参考。开发者们期待着 Node.js 和 Bun 在未来能够共同推动 JavaScript 生态系统的进步。