Bun

基準測試

Bun 的設計目標是速度。熱路徑經過廣泛的剖析和基準測試。所有 Bun 公開基準測試的原始碼都可以在 Bun 儲存庫的 /bench 目錄中找到。

測量時間

為了精確測量時間,Bun 提供了兩個執行時期 API 函式

  1. Web 標準 performance.now() 函式
  2. Bun.nanoseconds()performance.now() 類似,但會傳回自應用程式啟動以來經過的目前時間(以奈秒為單位)。您可以使用 performance.timeOrigin 將其轉換為 Unix 時間戳記。

基準測試工具

在撰寫您自己的基準測試時,選擇正確的工具非常重要。

  • 對於微基準測試,一個很棒的通用工具是 mitata
  • 對於負載測試,您必須使用一個 HTTP 基準測試工具,其速度至少與 Bun.serve() 一樣快,否則您的結果將會偏差。一些流行的基於 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