Bun 的设计目标是速度。热路径经过广泛的分析和基准测试。所有 Bun 公共基准的源代码都可以在 Bun 仓库的 /bench
目录中找到。
测量时间
为了精确测量时间,Bun 提供了两个运行时 API 函数
- Web 标准
performance.now()
函数 Bun.nanoseconds()
,它与performance.now()
类似,但它返回自应用程序启动以来当前时间(以纳秒为单位)。你可以使用performance.timeOrigin
将其转换为 Unix 时间戳。
基准测试工具
在编写自己的基准测试时,选择合适的工具非常重要。
- 对于微基准测试,一个非常棒的通用工具是
mitata
。 - 对于负载测试,你必须使用一个至少与
Bun.serve()
一样快的 HTTP 基准测试工具,否则你的结果将会出现偏差。一些流行的基于 Node.js 的基准测试工具(如autocannon
)不够快。我们推荐以下工具之一 - 对于基准测试脚本或 CLI 命令,我们推荐
hyperfine
。
测量内存使用情况
Bun 有两个堆。一个堆用于 JavaScript 运行时,另一个堆用于其他所有内容。
#JavaScript 堆统计信息
bun:jsc
模块提供了一些用于测量内存使用情况的函数
import { heapStats } from "bun:jsc";
console.log(heapStats());
查看示例统计信息
JavaScript 是一种垃圾回收语言,而不是引用计数语言。在所有情况下,对象不能立即释放都是正常且正确的,尽管对象永远不能释放是不正常的。
手动强制垃圾回收运行
Bun.gc(true); // synchronous
Bun.gc(false); // asynchronous
堆快照让你可以检查哪些对象没有被释放。你可以使用 bun:jsc
模块获取堆快照,然后使用 Safari 或 WebKit GTK 开发者工具查看它。要生成堆快照
import { generateHeapSnapshot } from "bun";
const snapshot = generateHeapSnapshot();
await Bun.write("heap.json", JSON.stringify(snapshot, null, 2));
要查看快照,请在 Safari 的开发者工具(或 WebKit GTK)中打开 heap.json
文件
- 打开开发者工具
- 点击“时间线”
- 在左侧的菜单中点击“JavaScript 分配”。在点击铅笔图标以显示所有时间线之前,它可能不可见
- 点击“导入”并选择你的堆快照 JSON
导入后,你应该会看到类似这样的内容
原生堆统计信息
Bun 使用 mimalloc 作为另一个堆。若要报告非 JavaScript 内存使用情况的摘要,请设置 MIMALLOC_SHOW_STATS=1
环境变量。退出时将打印统计信息。
MIMALLOC_SHOW_STATS=1 bun script.js
# will show something like this:
heap stats: peak total freed current unit count
reserved: 64.0 MiB 64.0 MiB 0 64.0 MiB not all freed!
committed: 64.0 MiB 64.0 MiB 0 64.0 MiB not all freed!
reset: 0 0 0 0 ok
touched: 128.5 KiB 128.5 KiB 5.4 MiB -5.3 MiB ok
segments: 1 1 0 1 not all freed!
-abandoned: 0 0 0 0 ok
-cached: 0 0 0 0 ok
pages: 0 0 53 -53 ok
-abandoned: 0 0 0 0 ok
-extended: 0
-noretire: 0
mmaps: 0
commits: 0
threads: 0 0 0 0 ok
searches: 0.0 avg
numa nodes: 1
elapsed: 0.068 s
process: user: 0.061 s, system: 0.014 s, faults: 0, rss: 57.4 MiB, commit: 64.0 MiB