在刚刚过去的五月,Bun团队只发布了三个小版本更新(v1.1.8、v1.1.9和v1.1.10),在不断优化性能和提升稳定性的同时,也为开发者带来了许多新的功能和改进。这些更新不仅修复了大量的bug,还对关键功能进行了显著的优化,尤其是fetch函数的内存使用效率。
主要更新内容概述
这三次更新总共修复了超过140个bug,涉及从Windows平台稳定性到Node.js兼容性的各个方面。以下是几个关键改进:
- 异常处理改进:添加了对
process.on("uncaughtException")
和process.on("unhandledRejection")
的支持,提升了应用程序的错误处理能力。 - 性能优化:多项功能性能提升显著,例如
JSON.parse
速度加快,atob()
函数提速8倍,toString('base64url')
提速5倍,fetch()
函数提速并减少内存使用。 - 新功能添加:新增了
dns.prefetch()
API和expect().toBeReturned()
matcher,进一步丰富了Bun的功能集。 - Windows改进:解决了多个Windows平台上的兼容性问题,提升了安装、路径加载等操作的可靠性。特别是
bun install
在未缓存的情况下速度提高了2倍,显著提升了开发者在Windows平台上的体验。 - Bun Shell和Bun APIs更新:添加了对
[Symbol.dispose]
的支持,修复了许多Bun Shell相关问题。
fetch内存使用优化
在最新的v1.1.10版本中,Bun团队重点优化了fetch函数的内存使用,使其在处理HTTP请求时更加高效。以下是具体的优化过程:
-
Promise与Response管理:在进行HTTP请求时,
Promise
对象必须一直保留,直到HTTP状态码和头信息被接收。因此,在Bun v1.1.9及以前版本中,Response
和其主体在整个响应过程中都被保留。这种方式虽然简单,但导致了不必要的内存占用。 -
弱引用与强引用结合:为了优化内存使用,Bun利用了JavaScriptCore的
JSC::Weak
和JSC::Strong
引用机制。首先在获取HTTP头信息和状态码后释放Promise
的强引用,接着通过弱引用和终结器函数管理Response
对象的生命周期。 -
引用计数机制:仅依靠弱引用并不足以完全管理
Response
对象的生命周期,特别是在处理流式数据时。为此,Bun引入了引用计数机制。当存在未处理的数据时,通过增加引用计数来保持Response
对象;当垃圾回收器通知Response
对象已被回收时,若引用计数为零,则释放相关资源。
这些优化措施大幅减少了fetch函数的内存占用,使其在处理大规模数据和高并发请求时更加高效。
结语
Bun团队在五月的三个版本更新中,通过修复大量bug、优化性能和提升稳定性,进一步增强了Bun作为现代JavaScript运行时的竞争力。特别是fetch内存优化的引入,以及bun install
在Windows平台上速度的显著提升,显示了Bun团队在性能调优方面的不懈努力。期待未来Bun能继续带来更多创新和改进,助力开发者构建更加高效和可靠的应用。