5月29日 00:26

Bun 在 I/O 性能方面做了哪些优化?

Bun用Zig语言编写,I/O优化的核心是绕过libuv,直接走系统调用。具体优化:文件I/O使用Bun.file()API,底层通过mmap内存映射和直接syscall读写,Linux上利用io_uring实现异步,避免Node.js经libuv线程池的开销;HTTP服务Bun.serve()构建,基于零拷贝响应和原生HTTP解析器(不用Node的http-parser),基准吞吐量高出Node.js约3倍;SQLite内置驱动直接编译进运行时,省去FFI调用开销;启动优化通过原生TypeScript执行(无需tsc编译步骤)和全局缓存减少冷启动I/O。总结:Node.js的I/O路径是JS→V8→libuv→OS,Bun是JS→JavaScriptCore→Zig syscall→OS,少了中间层。

追问

  • io_uring在Linux上的性能优势具体来自哪里?macOS上Bun用什么替代方案?
  • Bun.serve的零拷贝是如何实现的?Response对象哪些场景下会触发拷贝?
  • Bun.file()和Node.js的fs.promises.readFile在处理大文件时的内存占用差多少?
  • 内置SQLite驱动和better-sqlite3相比,性能差距主要在哪?
  • Bun的HTTP客户端(Bun.fetch)也做了类似的零拷贝优化吗?

写段代码

javascript
// Bun: 零拷贝文件服务 const file = Bun.file('./data.json'); Bun.serve({ fetch: (req) => new Response(file), // 直接返回文件流,无需读取到内存 port: 3000 });
标签:Bun