Bun v1.4.4 实测:2,025 个文件,bun fmt 2.6 秒跑完

先给结论:Bun v1.4.4把 bun fmt、bun check、bun install、Bun.SQL 全塞进了一个补丁版本。我在自己机器上实测了前三项,官方基准一并列在下面。

bun fmt:286 倍是怎么来的

Bun 官方在 Prettier 自己的仓库(2,616 个文件)上跑了一次对比:

工具 耗时 峰值内存
bun fmt 59.7 ms 48 MB
Prettier 3.9.10 17.1 s 459 MB

在 vitest、date-fns、monkeytype、h3 四个项目上,是 Prettier 3.9.9 的 234 到 425 倍。跟 oxfmt 0.74.0 比,fumadocs(2,452 个文件)快 31 倍,vite 快 6.2 倍,RSSHub 快 3.0 倍。

我的实测(Windows,Bun 1.4.4):date-fns main 分支 2,025 个 TS/JS 文件,第一遍 2,643 ms,第二遍 916 ms,20 线程。time 显示 user 只有 0.077 秒------时间花在线程和 IO 上。

迁移只差三条命令

bun fmt --doctor 先看兼容性。我搭了个带 .prettierrc 的假项目,终端原话:

lua 复制代码
Using .prettierrc (Prettier config)
You can remove: @trivago/prettier-plugin-sort-imports, prettier,
prettier-plugin-tailwindcss

挂 CI 用 bun fmt --check(有待格式化文件时退出码 1)。换钩子用 --staged:

sh 复制代码
#!/bin/sh
bun fmt --staged

受控实验:三行烂格式代码,21.43 毫秒改完,输出与 Prettier 惯例一致。

兼容底线:Prettier 测试套件 9,731 个用例过 9,648 个(99.1%);330 个开源仓库跟 oxfmt 输出一致率 94.6%。有 4 处故意 不同------比如 CSS font-family: Font\ Awesome,Prettier 3.9.9 会输出 Font\Awesome(\A 被当成十六进制转义),bun fmt 原样保留。

bun check:省的不只是时间

项目 v1.4.4 v1.4.3
MUI docs 1.31 s / 1.3 GB 10.28 s / 11.2 GB
Supabase studio 1.27 s 2.84 s
VS Code 2.82 s 4.09 s

monorepo 用 bun check -b:4,000 个独立项目 13.65 s → 0.87 s(15.7x),峰值内存 1,987 MB → 872 MB。我的小项目实测:2 个文件 31.41 ms 抓到 TS2345,还提示我装 @types/bun。

bun install:两条救命改动

指数退避重试(最多 5 次,50/100/200/400/800 ms ±20% 抖动),注册表持续 503 一秒也能装上;Yarn Berry lockfile 可直接迁移(59.59 ms)。这版共修了 133 个 install issue。

其余值得记的:bun install --libc musl 让 Alpine 镜像不再装错 glibc 原生包;peer 依赖解析改得像 pnpm,@modelcontextprotocol/sdk 和 @remix-run/express 抢 express 不再靠猜;minimumReleaseAge = "3d" 支持单位(90m / 12 hours / 2 weeks),能挡刚发布就投毒的版本;packageExtensions 给漏声明依赖的包打补丁;bun pm cache pack/unpack 把缓存打成单文件在 CI 机器间搬运;bun publish --recursive 一条命令发完 monorepo,被依赖者先发。

Bun.SQL:每查省 48% CPU

PostgreSQL 客户端用户态指令:Point SELECT -48%、100 行 SELECT -30%、INSERT -21%、批量插入 1,000 行 × 10 列 -38%。query.cancel() 能掐掉跑飞的查询,COPY 流 1,000 MiB 以 255 MiB/s 过一遍、峰值 RSS 59 MiB。

bun:sqlite 的用户定义函数我在内存库上跑通了:

js 复制代码
db.function("add2", (a, b) => a + b);
db.query("SELECT add2(12, 4) AS sum").get(); // { sum: 16 }

db.aggregate("add_all", {
  start: 0,
  step: (total, value) => total + value,
});
db.query("SELECT add_all(dollars) AS total FROM expenses").get();

升不升

bun fmt 今晚就能换(--doctor 兜底 + 配置全兼容);bun check 值得试(先跟 tsc 对输出);Bun.SQL 新能力先观望(要有真实慢查询场景再迁)。

两个我没想明白的:官方基准全在 Linux/macOS,我 Windows 上的 2,643 ms 没法直接比;bun fmt 是 oxc_formatter 的移植、后者是 Biome formatter 的移植,两层移植靠 99.1% 通过率兜底,那 0.9% 落在你项目里就是你的问题。

原创技术博客 · 开源项目分享 · AI全栈创作社区 idao.fun

相关推荐
Liudef061 小时前
用 DeepSeek Search API 做一个干净的单文件搜索页面(附完整源码)
前端·人工智能·工具·搜索·deepseek
忆挽篱笙歌1 小时前
进程替换函数与shenll命令行解释器
前端·javascript·算法
计算机魔术师1 小时前
砸了2200亿美元还是不够用,AWS说2027年也卖完了
前端
2601_965305391 小时前
智慧农用的农业四情分别是什么
服务器·前端·人工智能
老徐聊GEO1 小时前
把“安徽“写进题面之后:多平台AI推荐名单的区域扰动测量(2026)
前端·人工智能·算法·geo优化
萧瑟余晖2 小时前
Spring Data JPA高级特性详解
后端·spring
moshuying2 小时前
DeppInfer系列之 - 矩阵、注意力与 GPU:拆解 DeepGEMM 与 FlashMLA
前端·javascript·面试
利威尔xu2 小时前
Go IM 源码实战(2):WebSocket 握手 11 步,少 1 个参数连不上
后端·websocket·微服务·面试·golang
燕落南枝2 小时前
CSS 分组选择器与链接伪类选择器详解
前端·css