Bun 1.0.21 版本发布,实现 console.table(),优化大文件上传性能

Bun发布了1.0.21版本。不仅包含了多项改进和性能优化,还特别在处理大文件上传时引入了一项关键的内存优化技术:写时复制(Copy-on-write)。这次更新修复了33个bug,并处理了80个反应,体现了对用户反馈的积极响应。新增功能如console.table(),为开发者调试提供了极大的便利。此外,Bun对Bun.write、Bun.file和bun:sqlite等模块进行了内存优化,提升了整体性能。

在bun:sqlite错误信息处理方面,此更新使错误信息更加详细,提供了丰富的错误上下文,包括SQLite的扩展错误消息和错误码。针对内存管理,bun:sqlite实现了更有效的内存占用管理,显著降低了大量操作的内存需求,并解决了使用latin1补充字符可能导致的bun:sqlite崩溃问题。

特别值得关注的是,Bun在1.0.21版本中对处理大文件上传时的内存优化做出了重大改进。在以往,通过FormData上传大文件时,每个文件在内存中都会变成一个Blob对象。如果需要将这些数据转换为ArrayBuffer,传统方法会导致数据被克隆,从而使得内存占用加倍。例如,上传一个128MB的文件,转换为ArrayBuffer后,内存占用可能增加至256MB。

为了解决这一问题,Bun采用了写时复制技术。这项技术利用虚拟内存的方法,在调用blob.arrayBuffer()时,并不会实际克隆数据。相反,它创建一个新的虚拟内存映射,指向相同的数据,仅在写入时才按4KB的块克隆数据。这意味着,在进行例如100次128MB的blob复制操作时,只会使用大约192MB的内存,而在早期版本中,这种操作会占用高达12,993MB的内存。尽管这种优化带来了一定的开销,因为为每个blob创建唯一的内存映射是一项昂贵的操作,但Bun只在blob大于8MB(或在–smol模式下为1MB)时使用这种优化。

除此之外,Bun还引入了对Blob对象的Bun.CryptoHasher支持,简化了从FormData中哈希化文件的上传过程,并增强了bun:test框架的测试功能。Bun修复了Bun.file()和Bun.write()操作中的内存泄漏问题,同时解决了一系列稳定性问题,包括修复了在特定情况下fetch()、WebSocket客户端、Bun.listen和Bun.connect的崩溃问题。Bun.serve的流式传输问题、console.log()的输出问题以及expect(error).toStrictEqual()的行为问题也得到了修复。最后,Bun改进了对重复依赖的处理方式,现在会以警告而非错误的形式提示用户。

总之,Bun的这些更新和修复显著提高了其性能和稳定性,同时增强了与现有JavaScript生态系统的兼容性。对于开发者而言,这些改进尤其在处理大型文件和复杂应用场景时表现出色,展示了其卓越的性能优化和内存管理能力。