Bun

基准测试

Bun 的设计目标是速度。热路径经过广泛的分析和基准测试。所有 Bun 公共基准的源代码都可以在 Bun 仓库的 /bench 目录中找到。

测量时间

为了精确测量时间,Bun 提供了两个运行时 API 函数

  1. Web 标准 performance.now() 函数
  2. 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 文件

  1. 打开开发者工具
  2. 点击“时间线”
  3. 在左侧的菜单中点击“JavaScript 分配”。在点击铅笔图标以显示所有时间线之前,它可能不可见
  4. 点击“导入”并选择你的堆快照 JSON
Import heap json
导入堆快照

导入后,你应该会看到类似这样的内容

Viewing heap snapshot in Safari
在 Safari Dev Tools 中查看堆快照

原生堆统计信息

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