Skip to content

Add agent discovery Link headers#450

Merged
frostney merged 2 commits into
mainfrom
t3code/agent-link-headers
Apr 29, 2026
Merged

Add agent discovery Link headers#450
frostney merged 2 commits into
mainfrom
t3code/agent-link-headers

Conversation

@frostney
Copy link
Copy Markdown
Owner

Summary

  • Add RFC 8288 Link headers on the homepage for api-catalog and service-doc discovery.
  • Add /.well-known/api-catalog as an application/linkset+json route listing public API endpoints and docs.
  • Cover the discovery header and catalog route with Bun tests.

Verification

  • bun run lint
  • bun test
  • bun run build
  • curl -I http://localhost:3210/ confirmed rel="api-catalog" and rel="service-doc" headers.
  • curl http://localhost:3210/.well-known/api-catalog returned Linkset JSON.

@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 29, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
gocciascript-homepage Ready Ready Preview, Comment Apr 29, 2026 0:15am

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 29, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 7c5b0322-e9c7-4f39-a376-7425c8a38317

📥 Commits

Reviewing files that changed from the base of the PR and between 88ac3e9 and b467f90.

📒 Files selected for processing (2)
  • website/src/__tests__/agent-discovery.test.ts
  • website/src/app/.well-known/api-catalog/route.ts
✅ Files skipped from review due to trivial changes (2)
  • website/src/app/.well-known/api-catalog/route.ts
  • website/src/tests/agent-discovery.test.ts

📝 Walkthrough

Walkthrough

Adds agent discovery: a linkset-based API catalog generator, a dynamic route serving it at /.well-known/api-catalog with proper headers, and a Next.js root header that advertises the catalog and docs.

Changes

Cohort / File(s) Summary
Next config
website/next.config.ts
Adds an async headers() export that injects a Link response header on /, sourcing its value from AGENT_DISCOVERY_LINK_HEADER.
Agent discovery library
website/src/lib/agent-discovery.ts
New module defining API_CATALOG_PATH, AGENT_DISCOVERY_LINK_HEADER, helper for absolute URLs, and buildApiCatalog(origin) which returns a linkset with item, service-doc, and describedby entries.
API route
website/src/app/.well-known/api-catalog/route.ts
New dynamic route (export const dynamic = "force-dynamic") with GET handler that derives origin, calls buildApiCatalog(origin), and returns prettified JSON with Content-Type: application/linkset+json and a Link self header.
Tests
website/src/__tests__/agent-discovery.test.ts
New Bun test suite validating the root Link header, buildApiCatalog output (absolute URLs and expected entries), and the GET /.well-known/api-catalog response headers and JSON body.

Sequence Diagram

sequenceDiagram
    participant Client
    participant Server as Next.js
    participant Lib as agent-discovery
    participant Route as /.well-known/api-catalog

    Client->>Server: GET /
    Server->>Server: run headers()
    Server->>Lib: read AGENT_DISCOVERY_LINK_HEADER
    Server-->>Client: Response with Link header (catalog + docs)

    Client->>Route: GET /.well-known/api-catalog
    Route->>Route: derive origin from request URL
    Route->>Lib: buildApiCatalog(origin)
    Lib-->>Route: linkset JSON
    Route-->>Client: 200 application/linkset+json + Link self header
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Add agent discovery Link headers' directly summarizes the main change: adding RFC 8288 Link headers for agent discovery, which is the primary feature introduced across all modified files.
Description check ✅ Passed The PR description covers the summary section with clear bullet points describing changes, includes verification steps demonstrating testing, and references relevant standards (RFC 8288). However, it deviates from the template's Testing section structure.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Review rate limit: 0/5 reviews remaining, refill in 48 minutes and 3 seconds.

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 29, 2026

Benchmark Results

407 benchmarks

Interpreted: 🟢 356 improved · 🔴 7 regressed · 44 unchanged · avg +9.0%
Bytecode: 🟢 47 improved · 🔴 230 regressed · 130 unchanged · avg -3.6%

arraybuffer.js — Interp: 🟢 9, 5 unch. · avg +8.2% · Bytecode: 🟢 2, 🔴 5, 7 unch. · avg -1.4%
Benchmark Interpreted Δ Bytecode Δ
create ArrayBuffer(0) 182,895 ops/sec [180,591..185,340] → 195,263 ops/sec [125,432..200,593] ~ overlap (+6.8%) 238,992 ops/sec [205,013..247,186] → 231,867 ops/sec [174,299..238,920] ~ overlap (-3.0%)
create ArrayBuffer(64) 177,636 ops/sec [172,092..178,031] → 194,020 ops/sec [191,409..199,776] 🟢 +9.2% 232,031 ops/sec [230,916..232,843] → 224,848 ops/sec [224,230..227,097] 🔴 -3.1%
create ArrayBuffer(1024) 150,506 ops/sec [149,452..152,864] → 162,131 ops/sec [161,271..163,103] 🟢 +7.7% 189,561 ops/sec [188,873..191,728] → 194,295 ops/sec [193,325..196,327] 🟢 +2.5%
create ArrayBuffer(8192) 82,914 ops/sec [81,056..84,483] → 80,864 ops/sec [79,804..81,402] ~ overlap (-2.5%) 87,437 ops/sec [85,958..87,826] → 105,316 ops/sec [104,868..106,329] 🟢 +20.4%
slice full buffer (64 bytes) 194,328 ops/sec [190,638..196,711] → 212,453 ops/sec [194,282..213,386] ~ overlap (+9.3%) 273,884 ops/sec [198,466..282,211] → 267,976 ops/sec [266,551..269,681] ~ overlap (-2.2%)
slice half buffer (512 of 1024 bytes) 171,241 ops/sec [170,628..171,924] → 187,287 ops/sec [182,413..192,056] 🟢 +9.4% 237,793 ops/sec [235,428..240,616] → 237,943 ops/sec [235,431..240,339] ~ overlap (+0.1%)
slice with negative indices 160,631 ops/sec [158,686..161,855] → 180,051 ops/sec [176,866..181,127] 🟢 +12.1% 246,961 ops/sec [239,443..257,719] → 245,749 ops/sec [195,719..248,108] ~ overlap (-0.5%)
slice empty range 183,280 ops/sec [179,554..186,583] → 204,797 ops/sec [202,706..205,674] 🟢 +11.7% 258,679 ops/sec [255,338..262,097] → 249,944 ops/sec [244,032..252,817] 🔴 -3.4%
byteLength access 429,251 ops/sec [418,439..437,321] → 468,315 ops/sec [462,285..474,640] 🟢 +9.1% 718,856 ops/sec [708,128..732,203] → 652,375 ops/sec [648,503..655,637] 🔴 -9.2%
Symbol.toStringTag access 355,410 ops/sec [350,899..363,947] → 384,355 ops/sec [357,520..393,233] ~ overlap (+8.1%) 464,283 ops/sec [423,908..470,611] → 427,736 ops/sec [424,670..430,531] ~ overlap (-7.9%)
ArrayBuffer.isView 257,061 ops/sec [251,645..258,599] → 290,359 ops/sec [286,901..291,925] 🟢 +13.0% 371,619 ops/sec [369,850..371,857] → 335,771 ops/sec [328,606..338,830] 🔴 -9.6%
clone ArrayBuffer(64) 175,812 ops/sec [172,683..177,768] → 190,732 ops/sec [189,552..192,482] 🟢 +8.5% 230,501 ops/sec [226,024..236,985] → 222,400 ops/sec [221,940..224,060] 🔴 -3.5%
clone ArrayBuffer(1024) 148,832 ops/sec [147,575..150,352] → 155,890 ops/sec [149,399..161,315] ~ overlap (+4.7%) 190,097 ops/sec [186,012..192,079] → 191,620 ops/sec [190,411..193,109] ~ overlap (+0.8%)
clone ArrayBuffer inside object 122,368 ops/sec [120,869..122,901] → 131,388 ops/sec [127,332..132,555] 🟢 +7.4% 148,729 ops/sec [146,289..150,356] → 146,591 ops/sec [146,082..148,530] ~ overlap (-1.4%)
arrays.js — Interp: 🟢 19 · avg +9.2% · Bytecode: 🔴 16, 3 unch. · avg -6.0%
Benchmark Interpreted Δ Bytecode Δ
Array.from length 100 4,070 ops/sec [3,859..4,211] → 4,601 ops/sec [4,308..4,805] 🟢 +13.1% 7,452 ops/sec [7,340..7,542] → 6,848 ops/sec [6,616..7,189] 🔴 -8.1%
Array.from 10 elements 92,173 ops/sec [91,406..94,082] → 102,647 ops/sec [99,794..103,503] 🟢 +11.4% 107,604 ops/sec [107,422..108,006] → 101,497 ops/sec [99,651..101,926] 🔴 -5.7%
Array.of 10 elements 112,222 ops/sec [108,235..113,370] → 126,896 ops/sec [125,101..128,056] 🟢 +13.1% 135,510 ops/sec [133,930..138,030] → 129,012 ops/sec [128,017..130,802] 🔴 -4.8%
spread into new array 138,592 ops/sec [136,932..143,707] → 149,056 ops/sec [146,665..153,401] 🟢 +7.6% 84,535 ops/sec [82,971..86,311] → 84,057 ops/sec [82,955..85,564] ~ overlap (-0.6%)
map over 50 elements 7,059 ops/sec [6,967..7,199] → 7,754 ops/sec [7,524..8,090] 🟢 +9.9% 13,444 ops/sec [13,245..13,522] → 12,786 ops/sec [12,700..12,904] 🔴 -4.9%
filter over 50 elements 6,500 ops/sec [6,417..6,592] → 7,024 ops/sec [6,894..7,187] 🟢 +8.1% 13,197 ops/sec [13,164..13,245] → 12,071 ops/sec [11,981..12,353] 🔴 -8.5%
reduce sum 50 elements 7,350 ops/sec [7,243..7,392] → 8,045 ops/sec [7,857..8,050] 🟢 +9.5% 12,719 ops/sec [12,578..12,830] → 11,971 ops/sec [11,797..12,030] 🔴 -5.9%
forEach over 50 elements 6,749 ops/sec [6,573..6,777] → 7,246 ops/sec [7,082..7,308] 🟢 +7.4% 12,073 ops/sec [10,089..12,768] → 11,986 ops/sec [11,941..12,050] ~ overlap (-0.7%)
find in 50 elements 9,572 ops/sec [9,551..9,650] → 10,200 ops/sec [10,163..10,341] 🟢 +6.6% 19,463 ops/sec [19,331..19,606] → 17,918 ops/sec [16,828..18,098] 🔴 -7.9%
sort 20 elements 3,665 ops/sec [3,626..3,734] → 3,952 ops/sec [3,925..4,000] 🟢 +7.8% 7,656 ops/sec [7,454..7,746] → 6,782 ops/sec [6,760..6,826] 🔴 -11.4%
flat nested array 48,338 ops/sec [47,415..48,802] → 51,535 ops/sec [50,202..52,288] 🟢 +6.6% 53,463 ops/sec [53,140..54,745] → 51,921 ops/sec [51,844..52,039] 🔴 -2.9%
flatMap 27,644 ops/sec [27,038..28,108] → 29,810 ops/sec [29,676..30,524] 🟢 +7.8% 37,767 ops/sec [37,041..38,572] → 35,528 ops/sec [35,421..35,865] 🔴 -5.9%
map inside map (5x5) 7,259 ops/sec [7,143..7,341] → 8,013 ops/sec [7,990..8,040] 🟢 +10.4% 11,431 ops/sec [11,374..11,436] → 10,552 ops/sec [10,488..10,608] 🔴 -7.7%
filter inside map (5x10) 5,041 ops/sec [5,024..5,047] → 5,589 ops/sec [5,560..5,632] 🟢 +10.9% 9,268 ops/sec [9,152..9,355] → 8,311 ops/sec [8,247..8,333] 🔴 -10.3%
reduce inside map (5x10) 5,848 ops/sec [5,791..5,900] → 6,452 ops/sec [6,413..6,500] 🟢 +10.3% 10,031 ops/sec [9,938..10,091] → 9,274 ops/sec [9,196..9,353] 🔴 -7.5%
forEach inside forEach (5x10) 5,210 ops/sec [5,190..5,235] → 5,728 ops/sec [5,635..5,849] 🟢 +9.9% 9,778 ops/sec [9,564..10,015] → 9,282 ops/sec [9,159..9,359] 🔴 -5.1%
find inside some (10x10) 4,246 ops/sec [4,141..4,377] → 4,645 ops/sec [4,634..4,723] 🟢 +9.4% 7,858 ops/sec [7,778..7,974] → 7,420 ops/sec [7,363..7,440] 🔴 -5.6%
map+filter chain nested (5x20) 1,599 ops/sec [1,572..1,635] → 1,733 ops/sec [1,712..1,752] 🟢 +8.4% 2,996 ops/sec [2,980..3,002] → 2,732 ops/sec [2,719..2,757] 🔴 -8.8%
reduce flatten (10x5) 16,749 ops/sec [16,619..16,856] → 17,766 ops/sec [17,683..18,225] 🟢 +6.1% 8,016 ops/sec [7,975..8,064] → 7,860 ops/sec [7,728..7,976] ~ overlap (-1.9%)
async-await.js — Interp: 🟢 5, 1 unch. · avg +7.5% · Bytecode: 🟢 1, 🔴 1, 4 unch. · avg +0.8%
Benchmark Interpreted Δ Bytecode Δ
single await 146,729 ops/sec [121,013..149,545] → 157,340 ops/sec [105,622..161,165] ~ overlap (+7.2%) 172,614 ops/sec [131,717..179,956] → 177,459 ops/sec [163,798..178,184] ~ overlap (+2.8%)
multiple awaits 71,112 ops/sec [69,875..71,469] → 76,812 ops/sec [75,703..78,164] 🟢 +8.0% 79,635 ops/sec [79,022..80,106] → 79,046 ops/sec [77,955..79,716] ~ overlap (-0.7%)
await non-Promise value 293,166 ops/sec [288,640..296,665] → 311,794 ops/sec [311,436..314,911] 🟢 +6.4% 438,584 ops/sec [436,064..440,814] → 465,524 ops/sec [456,257..467,449] 🟢 +6.1%
await with try/catch 142,365 ops/sec [141,097..145,216] → 149,817 ops/sec [149,287..150,091] 🟢 +5.2% 177,431 ops/sec [174,690..179,101] → 176,032 ops/sec [174,086..177,056] ~ overlap (-0.8%)
await Promise.all 23,120 ops/sec [22,840..23,318] → 25,487 ops/sec [25,246..25,738] 🟢 +10.2% 24,647 ops/sec [20,143..24,872] → 24,457 ops/sec [24,084..24,908] ~ overlap (-0.8%)
nested async function call 78,755 ops/sec [78,112..79,487] → 84,890 ops/sec [83,776..86,082] 🟢 +7.8% 108,925 ops/sec [108,454..109,322] → 107,104 ops/sec [104,277..107,931] 🔴 -1.7%
async-generators.js — Interp: 🟢 2 · avg +10.4% · Bytecode: 🔴 1, 1 unch. · avg -2.6%
Benchmark Interpreted Δ Bytecode Δ
for-await-of over async generator 3,458 ops/sec [3,412..3,478] → 3,783 ops/sec [3,632..3,811] 🟢 +9.4% 624 ops/sec [419..632] → 602 ops/sec [581..612] ~ overlap (-3.5%)
async generator with await in body 24,521 ops/sec [24,326..25,787] → 27,303 ops/sec [27,091..27,940] 🟢 +11.3% 20,106 ops/sec [19,971..20,217] → 19,773 ops/sec [19,698..19,865] 🔴 -1.7%
base64.js — Interp: 🟢 10 · avg +9.1% · Bytecode: 🔴 8, 2 unch. · avg -4.7%
Benchmark Interpreted Δ Bytecode Δ
short ASCII (13 chars) 4,237 ops/sec [4,177..4,365] → 4,732 ops/sec [4,629..4,745] 🟢 +11.7% 4,772 ops/sec [4,607..4,862] → 4,668 ops/sec [4,650..4,759] ~ overlap (-2.2%)
medium ASCII (450 chars) 163 ops/sec [161..164] → 176 ops/sec [175..178] 🟢 +7.9% 178 ops/sec [152..181] → 174 ops/sec [172..175] ~ overlap (-2.0%)
Latin-1 characters 6,305 ops/sec [6,192..6,376] → 6,927 ops/sec [6,798..7,055] 🟢 +9.9% 7,031 ops/sec [6,913..7,075] → 6,808 ops/sec [6,758..6,861] 🔴 -3.2%
short base64 (20 chars) 2,453 ops/sec [2,425..2,495] → 2,665 ops/sec [2,655..2,691] 🟢 +8.7% 2,719 ops/sec [2,697..2,768] → 2,590 ops/sec [2,554..2,619] 🔴 -4.7%
medium base64 (600 chars) 105 ops/sec [105..106] → 114 ops/sec [112..116] 🟢 +8.2% 116 ops/sec [115..117] → 109 ops/sec [109..110] 🔴 -5.9%
Latin-1 output 3,445 ops/sec [3,314..3,504] → 3,761 ops/sec [3,724..3,788] 🟢 +9.2% 3,870 ops/sec [3,836..3,959] → 3,568 ops/sec [3,546..3,591] 🔴 -7.8%
forgiving (no padding) 5,164 ops/sec [5,116..5,227] → 5,685 ops/sec [5,615..5,695] 🟢 +10.1% 5,832 ops/sec [5,768..5,889] → 5,378 ops/sec [5,329..5,445] 🔴 -7.8%
with whitespace 2,223 ops/sec [2,196..2,227] → 2,440 ops/sec [2,391..2,474] 🟢 +9.8% 2,500 ops/sec [2,469..2,540] → 2,325 ops/sec [2,312..2,339] 🔴 -7.0%
atob(btoa(short)) 1,607 ops/sec [1,594..1,619] → 1,741 ops/sec [1,705..1,755] 🟢 +8.3% 1,750 ops/sec [1,708..1,783] → 1,671 ops/sec [1,651..1,683] 🔴 -4.5%
atob(btoa(medium)) 64 ops/sec [64..65] → 69 ops/sec [67..71] 🟢 +7.7% 70 ops/sec [69..70] → 68 ops/sec [68..69] 🔴 -2.2%
classes.js — Interp: 🟢 23, 8 unch. · avg +6.5% · Bytecode: 🟢 3, 🔴 9, 19 unch. · avg -2.4%
Benchmark Interpreted Δ Bytecode Δ
simple class new 59,101 ops/sec [58,884..59,771] → 63,361 ops/sec [63,308..63,421] 🟢 +7.2% 90,820 ops/sec [89,468..91,091] → 87,409 ops/sec [80,754..88,848] 🔴 -3.8%
class with defaults 47,528 ops/sec [47,336..47,818] → 50,655 ops/sec [49,881..51,590] 🟢 +6.6% 62,865 ops/sec [62,536..63,530] → 59,153 ops/sec [58,574..59,632] 🔴 -5.9%
50 instances via Array.from 2,248 ops/sec [2,220..2,266] → 2,365 ops/sec [2,254..2,386] ~ overlap (+5.2%) 4,032 ops/sec [3,914..4,097] → 3,692 ops/sec [3,581..3,735] 🔴 -8.4%
instance method call 28,395 ops/sec [28,247..28,852] → 30,251 ops/sec [29,734..30,478] 🟢 +6.5% 45,916 ops/sec [45,555..45,997] → 43,545 ops/sec [43,219..43,797] 🔴 -5.2%
static method call 43,711 ops/sec [43,075..44,165] → 46,703 ops/sec [46,170..47,275] 🟢 +6.8% 82,254 ops/sec [80,329..83,279] → 80,331 ops/sec [79,464..80,701] ~ overlap (-2.3%)
single-level inheritance 23,145 ops/sec [22,954..23,861] → 25,178 ops/sec [24,823..25,323] 🟢 +8.8% 33,814 ops/sec [33,393..33,994] → 33,125 ops/sec [32,657..33,943] ~ overlap (-2.0%)
two-level inheritance 20,272 ops/sec [19,971..20,879] → 21,929 ops/sec [21,702..22,308] 🟢 +8.2% 26,903 ops/sec [26,820..27,010] → 26,489 ops/sec [26,076..26,931] ~ overlap (-1.5%)
private field access 31,242 ops/sec [30,981..31,797] → 34,151 ops/sec [33,844..34,662] 🟢 +9.3% 46,329 ops/sec [45,941..47,080] → 44,503 ops/sec [43,968..44,953] 🔴 -3.9%
private methods 34,200 ops/sec [33,235..35,162] → 37,658 ops/sec [37,496..37,990] 🟢 +10.1% 49,545 ops/sec [49,173..49,872] → 48,028 ops/sec [47,582..48,680] 🔴 -3.1%
getter/setter access 31,584 ops/sec [31,073..32,231] → 34,643 ops/sec [34,075..35,014] 🟢 +9.7% 50,056 ops/sec [49,526..50,517] → 49,546 ops/sec [49,168..49,699] ~ overlap (-1.0%)
class decorator (identity) 41,505 ops/sec [41,126..41,829] → 45,383 ops/sec [44,626..45,765] 🟢 +9.3% 52,472 ops/sec [52,152..53,057] → 51,338 ops/sec [50,733..52,354] ~ overlap (-2.2%)
class decorator (wrapping) 24,952 ops/sec [24,348..25,049] → 26,864 ops/sec [26,790..27,039] 🟢 +7.7% 28,492 ops/sec [27,767..28,826] → 27,644 ops/sec [26,378..28,560] ~ overlap (-3.0%)
identity method decorator 30,525 ops/sec [29,942..30,739] → 33,039 ops/sec [32,689..33,237] 🟢 +8.2% 42,525 ops/sec [41,172..44,511] → 42,668 ops/sec [41,934..43,284] ~ overlap (+0.3%)
wrapping method decorator 25,245 ops/sec [25,179..25,556] → 26,679 ops/sec [26,030..27,177] 🟢 +5.7% 32,939 ops/sec [31,697..34,496] → 31,990 ops/sec [31,451..32,800] ~ overlap (-2.9%)
stacked method decorators (x3) 17,270 ops/sec [17,080..17,393] → 18,664 ops/sec [17,991..19,198] 🟢 +8.1% 21,542 ops/sec [20,586..22,033] → 22,219 ops/sec [21,900..22,668] ~ overlap (+3.1%)
identity field decorator 34,727 ops/sec [34,053..35,489] → 36,695 ops/sec [36,020..37,522] 🟢 +5.7% 41,196 ops/sec [39,253..41,703] → 39,803 ops/sec [38,865..40,979] ~ overlap (-3.4%)
field initializer decorator 28,184 ops/sec [27,690..29,086] → 30,237 ops/sec [29,904..30,562] 🟢 +7.3% 33,387 ops/sec [32,621..33,804] → 35,718 ops/sec [35,037..36,837] 🟢 +7.0%
getter decorator (identity) 31,079 ops/sec [30,751..31,462] → 33,677 ops/sec [32,798..34,149] 🟢 +8.4% 38,430 ops/sec [37,692..39,202] → 36,318 ops/sec [35,897..36,705] 🔴 -5.5%
setter decorator (identity) 26,008 ops/sec [25,786..26,418] → 27,339 ops/sec [27,206..27,808] 🟢 +5.1% 31,158 ops/sec [30,968..31,240] → 32,250 ops/sec [32,027..32,404] 🟢 +3.5%
static method decorator 32,620 ops/sec [32,159..33,028] → 34,128 ops/sec [33,603..35,056] 🟢 +4.6% 42,125 ops/sec [41,197..43,886] → 41,924 ops/sec [41,059..42,027] ~ overlap (-0.5%)
static field decorator 38,358 ops/sec [37,837..40,635] → 41,150 ops/sec [39,923..43,218] ~ overlap (+7.3%) 44,867 ops/sec [42,944..45,305] → 45,087 ops/sec [43,158..46,069] ~ overlap (+0.5%)
private method decorator 25,062 ops/sec [24,784..25,368] → 26,951 ops/sec [26,704..27,251] 🟢 +7.5% 38,968 ops/sec [37,691..39,628] → 36,167 ops/sec [35,645..38,042] ~ overlap (-7.2%)
private field decorator 28,348 ops/sec [27,866..29,086] → 29,379 ops/sec [28,942..29,689] ~ overlap (+3.6%) 32,868 ops/sec [31,905..33,972] → 32,324 ops/sec [32,145..32,758] ~ overlap (-1.7%)
plain auto-accessor (no decorator) 50,103 ops/sec [48,925..51,497] → 51,248 ops/sec [50,581..54,646] ~ overlap (+2.3%) 50,717 ops/sec [48,365..52,924] → 47,112 ops/sec [46,346..49,295] ~ overlap (-7.1%)
auto-accessor with decorator 27,767 ops/sec [27,007..28,912] → 28,894 ops/sec [28,744..30,752] ~ overlap (+4.1%) 29,466 ops/sec [28,577..30,627] → 28,951 ops/sec [28,316..30,478] ~ overlap (-1.7%)
decorator writing metadata 22,089 ops/sec [21,431..22,739] → 23,315 ops/sec [22,611..23,557] ~ overlap (+5.5%) 25,817 ops/sec [25,356..27,993] → 25,024 ops/sec [22,681..26,508] ~ overlap (-3.1%)
static getter read 58,446 ops/sec [56,839..59,481] → 59,067 ops/sec [57,927..60,141] ~ overlap (+1.1%) 83,566 ops/sec [82,793..84,644] → 79,066 ops/sec [78,704..79,300] 🔴 -5.4%
static getter/setter pair 42,486 ops/sec [41,540..43,217] → 45,776 ops/sec [44,145..45,848] 🟢 +7.7% 57,162 ops/sec [55,521..58,455] → 55,867 ops/sec [54,753..58,001] ~ overlap (-2.3%)
inherited static getter 35,143 ops/sec [34,151..35,671] → 36,238 ops/sec [35,692..36,699] 🟢 +3.1% 42,010 ops/sec [41,538..42,150] → 43,288 ops/sec [42,985..43,662] 🟢 +3.0%
inherited static setter 37,332 ops/sec [37,184..37,468] → 38,851 ops/sec [38,763..39,044] 🟢 +4.1% 47,327 ops/sec [45,705..48,245] → 45,796 ops/sec [43,811..46,082] ~ overlap (-3.2%)
inherited static getter with this binding 30,973 ops/sec [30,219..31,906] → 32,843 ops/sec [31,672..33,067] ~ overlap (+6.0%) 39,646 ops/sec [39,274..40,017] → 37,466 ops/sec [37,129..38,275] 🔴 -5.5%
closures.js — Interp: 🟢 11 · avg +8.5% · Bytecode: 🔴 8, 3 unch. · avg -5.2%
Benchmark Interpreted Δ Bytecode Δ
closure over single variable 47,692 ops/sec [46,946..48,563] → 52,171 ops/sec [51,550..53,312] 🟢 +9.4% 155,452 ops/sec [153,128..160,460] → 151,486 ops/sec [150,899..152,148] 🔴 -2.6%
closure over multiple variables 48,006 ops/sec [47,420..48,764] → 52,741 ops/sec [51,811..53,565] 🟢 +9.9% 148,897 ops/sec [147,250..149,802] → 139,332 ops/sec [137,690..141,847] 🔴 -6.4%
nested closures 54,376 ops/sec [53,038..54,864] → 56,764 ops/sec [56,392..57,971] 🟢 +4.4% 146,349 ops/sec [145,673..149,683] → 143,581 ops/sec [142,580..145,465] 🔴 -1.9%
function as argument 36,496 ops/sec [35,581..36,771] → 38,855 ops/sec [38,452..39,332] 🟢 +6.5% 156,760 ops/sec [152,302..162,252] → 148,358 ops/sec [147,094..148,855] 🔴 -5.4%
function returning function 46,722 ops/sec [45,876..46,883] → 50,637 ops/sec [49,987..51,222] 🟢 +8.4% 171,635 ops/sec [167,094..175,195] → 167,543 ops/sec [165,661..168,764] ~ overlap (-2.4%)
compose two functions 28,186 ops/sec [27,260..28,520] → 30,792 ops/sec [30,113..30,971] 🟢 +9.2% 98,284 ops/sec [95,333..98,991] → 94,875 ops/sec [94,548..98,601] ~ overlap (-3.5%)
fn.call 62,914 ops/sec [62,511..64,366] → 68,679 ops/sec [68,071..69,718] 🟢 +9.2% 105,040 ops/sec [103,027..107,252] → 96,890 ops/sec [95,204..97,531] 🔴 -7.8%
fn.apply 49,753 ops/sec [49,189..50,464] → 53,624 ops/sec [52,983..53,711] 🟢 +7.8% 100,531 ops/sec [98,877..101,332] → 99,618 ops/sec [98,155..100,811] ~ overlap (-0.9%)
fn.bind 60,196 ops/sec [59,203..60,461] → 64,872 ops/sec [64,239..65,134] 🟢 +7.8% 181,988 ops/sec [176,575..185,233] → 171,821 ops/sec [171,313..174,303] 🔴 -5.6%
recursive sum to 50 4,159 ops/sec [4,084..4,206] → 4,650 ops/sec [4,592..4,677] 🟢 +11.8% 21,377 ops/sec [21,145..22,037] → 19,095 ops/sec [19,018..19,156] 🔴 -10.7%
recursive tree traversal 7,725 ops/sec [7,625..7,798] → 8,399 ops/sec [8,280..8,445] 🟢 +8.7% 21,147 ops/sec [20,822..22,025] → 18,996 ops/sec [18,883..19,164] 🔴 -10.2%
collections.js — Interp: 🟢 12 · avg +10.3% · Bytecode: 🟢 3, 🔴 2, 7 unch. · avg +0.3%
Benchmark Interpreted Δ Bytecode Δ
add 50 elements 3,077 ops/sec [3,032..3,097] → 3,318 ops/sec [3,269..3,349] 🟢 +7.8% 3,976 ops/sec [3,894..4,003] → 4,001 ops/sec [3,946..4,013] ~ overlap (+0.6%)
has lookup (50 elements) 44,359 ops/sec [44,114..44,755] → 49,088 ops/sec [48,412..49,623] 🟢 +10.7% 55,899 ops/sec [55,543..56,245] → 57,050 ops/sec [56,354..57,171] 🟢 +2.1%
delete elements 24,523 ops/sec [24,240..24,776] → 27,160 ops/sec [26,844..27,278] 🟢 +10.8% 29,413 ops/sec [28,776..29,758] → 29,609 ops/sec [29,478..29,767] ~ overlap (+0.7%)
forEach iteration 5,614 ops/sec [5,600..5,671] → 6,096 ops/sec [6,065..6,140] 🟢 +8.6% 9,548 ops/sec [9,477..9,664] → 8,807 ops/sec [8,762..8,902] 🔴 -7.8%
spread to array 16,038 ops/sec [15,669..16,238] → 17,762 ops/sec [17,402..18,218] 🟢 +10.7% 113,752 ops/sec [111,394..115,487] → 118,907 ops/sec [117,394..120,996] 🟢 +4.5%
deduplicate array 21,323 ops/sec [21,131..21,802] → 23,812 ops/sec [23,238..24,194] 🟢 +11.7% 38,932 ops/sec [38,657..39,073] → 40,654 ops/sec [40,092..41,056] 🟢 +4.4%
set 50 entries 2,271 ops/sec [2,138..2,286] → 2,445 ops/sec [2,406..2,467] 🟢 +7.6% 2,957 ops/sec [2,942..3,017] → 3,013 ops/sec [2,965..3,092] ~ overlap (+1.9%)
get lookup (50 entries) 43,904 ops/sec [43,244..44,486] → 49,117 ops/sec [47,458..49,795] 🟢 +11.9% 50,194 ops/sec [49,836..50,295] → 50,650 ops/sec [49,998..51,379] ~ overlap (+0.9%)
has check 63,312 ops/sec [63,150..63,848] → 70,524 ops/sec [68,027..74,037] 🟢 +11.4% 75,605 ops/sec [74,497..76,458] → 75,304 ops/sec [73,913..76,672] ~ overlap (-0.4%)
delete entries 23,828 ops/sec [23,637..23,965] → 27,019 ops/sec [26,443..28,210] 🟢 +13.4% 27,301 ops/sec [27,089..27,446] → 27,238 ops/sec [26,866..28,006] ~ overlap (-0.2%)
forEach iteration 5,658 ops/sec [5,570..5,722] → 6,231 ops/sec [5,934..6,312] 🟢 +10.1% 9,442 ops/sec [9,424..9,561] → 8,865 ops/sec [8,693..9,179] 🔴 -6.1%
keys/values/entries 4,360 ops/sec [4,310..4,417] → 4,759 ops/sec [4,718..4,767] 🟢 +9.2% 15,149 ops/sec [14,907..15,641] → 15,544 ops/sec [15,362..15,873] ~ overlap (+2.6%)
csv.js — Interp: 🟢 12, 1 unch. · avg +10.6% · Bytecode: 🔴 13 · avg -9.1%
Benchmark Interpreted Δ Bytecode Δ
parse simple 3-column CSV 47,696 ops/sec [46,869..48,075] → 52,460 ops/sec [51,927..52,838] 🟢 +10.0% 56,188 ops/sec [55,820..56,388] → 51,269 ops/sec [50,733..51,894] 🔴 -8.8%
parse 10-row CSV 13,524 ops/sec [13,425..13,608] → 14,755 ops/sec [14,435..14,842] 🟢 +9.1% 15,310 ops/sec [15,198..15,339] → 13,929 ops/sec [13,823..14,054] 🔴 -9.0%
parse 100-row CSV 2,122 ops/sec [2,035..2,171] → 2,261 ops/sec [2,239..2,303] 🟢 +6.5% 2,251 ops/sec [2,239..2,269] → 2,147 ops/sec [2,141..2,151] 🔴 -4.6%
parse CSV with quoted fields 68,593 ops/sec [63,086..73,116] → 75,219 ops/sec [73,082..77,531] ~ overlap (+9.7%) 78,361 ops/sec [78,220..78,805] → 74,387 ops/sec [73,808..75,179] 🔴 -5.1%
parse without headers (array of arrays) 5,690 ops/sec [5,574..5,703] → 6,235 ops/sec [5,805..6,410] 🟢 +9.6% 6,392 ops/sec [6,199..6,706] → 6,082 ops/sec [6,014..6,121] 🔴 -4.9%
parse with semicolon delimiter 9,747 ops/sec [9,472..9,966] → 10,663 ops/sec [10,326..10,900] 🟢 +9.4% 11,117 ops/sec [10,670..11,398] → 10,181 ops/sec [10,071..10,304] 🔴 -8.4%
stringify array of objects 67,858 ops/sec [65,661..69,636] → 75,887 ops/sec [75,693..76,374] 🟢 +11.8% 84,173 ops/sec [81,032..89,015] → 71,506 ops/sec [71,210..72,054] 🔴 -15.0%
stringify array of arrays 24,136 ops/sec [23,693..24,959] → 27,039 ops/sec [26,697..27,390] 🟢 +12.0% 28,126 ops/sec [28,041..28,308] → 23,364 ops/sec [23,164..23,759] 🔴 -16.9%
stringify with values needing escaping 49,950 ops/sec [49,435..50,608] → 56,192 ops/sec [55,890..57,808] 🟢 +12.5% 61,057 ops/sec [59,168..61,596] → 52,165 ops/sec [51,800..52,460] 🔴 -14.6%
reviver converts numbers 1,371 ops/sec [1,368..1,373] → 1,519 ops/sec [1,511..1,536] 🟢 +10.8% 1,688 ops/sec [1,655..1,756] → 1,588 ops/sec [1,565..1,625] 🔴 -5.9%
reviver filters empty to null 11,054 ops/sec [10,528..11,793] → 12,130 ops/sec [11,956..12,200] 🟢 +9.7% 14,961 ops/sec [14,460..15,417] → 14,085 ops/sec [13,895..14,241] 🔴 -5.9%
parse then stringify 8,199 ops/sec [8,139..8,424] → 9,255 ops/sec [9,163..9,450] 🟢 +12.9% 9,277 ops/sec [9,085..9,340] → 8,472 ops/sec [8,175..8,670] 🔴 -8.7%
stringify then parse 7,956 ops/sec [7,860..8,179] → 9,050 ops/sec [8,833..9,424] 🟢 +13.8% 9,272 ops/sec [8,953..9,696] → 8,330 ops/sec [8,124..8,521] 🔴 -10.2%
destructuring.js — Interp: 🟢 22 · avg +9.5% · Bytecode: 🟢 1, 🔴 11, 10 unch. · avg -3.3%
Benchmark Interpreted Δ Bytecode Δ
simple array destructuring 178,791 ops/sec [178,202..180,592] → 190,366 ops/sec [187,700..194,340] 🟢 +6.5% 127,404 ops/sec [126,005..136,178] → 123,772 ops/sec [122,944..124,143] 🔴 -2.9%
with rest element 118,990 ops/sec [116,704..119,359] → 131,661 ops/sec [130,346..132,787] 🟢 +10.6% 96,539 ops/sec [96,013..96,834] → 89,190 ops/sec [88,099..92,631] 🔴 -7.6%
with defaults 173,619 ops/sec [168,699..174,985] → 189,727 ops/sec [180,499..193,243] 🟢 +9.3% 151,612 ops/sec [150,678..155,238] → 150,252 ops/sec [149,536..151,949] ~ overlap (-0.9%)
skip elements 186,355 ops/sec [181,377..189,279] → 195,161 ops/sec [193,090..203,157] 🟢 +4.7% 138,956 ops/sec [138,672..139,357] → 139,449 ops/sec [134,865..142,418] ~ overlap (+0.4%)
nested array destructuring 84,776 ops/sec [83,459..85,229] → 94,210 ops/sec [93,190..95,381] 🟢 +11.1% 45,765 ops/sec [44,702..46,430] → 46,997 ops/sec [45,690..47,464] ~ overlap (+2.7%)
swap variables 215,859 ops/sec [213,939..220,365] → 239,041 ops/sec [228,675..244,209] 🟢 +10.7% 165,812 ops/sec [164,469..168,217] → 172,207 ops/sec [170,759..172,947] 🟢 +3.9%
simple object destructuring 143,398 ops/sec [141,168..145,304] → 159,944 ops/sec [153,754..162,115] 🟢 +11.5% 181,480 ops/sec [179,708..188,264] → 169,103 ops/sec [166,539..174,209] 🔴 -6.8%
with defaults 160,345 ops/sec [158,972..161,453] → 174,488 ops/sec [173,158..178,889] 🟢 +8.8% 240,349 ops/sec [237,691..246,099] → 236,093 ops/sec [226,332..240,115] ~ overlap (-1.8%)
with renaming 152,384 ops/sec [152,084..152,655] → 167,792 ops/sec [165,967..171,418] 🟢 +10.1% 187,187 ops/sec [185,038..190,309] → 173,599 ops/sec [171,856..176,483] 🔴 -7.3%
nested object destructuring 75,583 ops/sec [75,110..76,882] → 84,280 ops/sec [82,720..85,957] 🟢 +11.5% 92,509 ops/sec [89,942..93,132] → 87,325 ops/sec [84,812..89,660] 🔴 -5.6%
rest properties 55,223 ops/sec [54,672..56,337] → 59,060 ops/sec [58,097..59,210] 🟢 +6.9% 83,950 ops/sec [82,608..85,176] → 77,038 ops/sec [75,727..77,900] 🔴 -8.2%
object parameter 43,631 ops/sec [42,743..43,777] → 46,629 ops/sec [45,394..47,458] 🟢 +6.9% 75,108 ops/sec [73,041..75,574] → 70,256 ops/sec [69,037..72,705] 🔴 -6.5%
array parameter 53,638 ops/sec [52,755..55,993] → 58,530 ops/sec [56,813..58,738] 🟢 +9.1% 62,039 ops/sec [60,495..63,725] → 62,447 ops/sec [61,906..63,408] ~ overlap (+0.7%)
mixed destructuring in map 12,398 ops/sec [12,108..12,881] → 13,491 ops/sec [13,298..13,689] 🟢 +8.8% 19,860 ops/sec [19,594..20,278] → 18,220 ops/sec [17,621..18,494] 🔴 -8.3%
forEach with array destructuring 27,702 ops/sec [26,829..28,859] → 30,543 ops/sec [30,041..30,812] 🟢 +10.3% 24,043 ops/sec [23,720..24,393] → 23,347 ops/sec [23,175..24,159] ~ overlap (-2.9%)
map with array destructuring 28,893 ops/sec [28,816..28,956] → 31,702 ops/sec [30,959..31,904] 🟢 +9.7% 22,670 ops/sec [22,507..22,764] → 22,923 ops/sec [22,539..23,712] ~ overlap (+1.1%)
filter with array destructuring 29,242 ops/sec [28,846..29,873] → 32,308 ops/sec [31,659..33,136] 🟢 +10.5% 25,384 ops/sec [21,991..25,686] → 24,407 ops/sec [24,237..24,717] ~ overlap (-3.8%)
reduce with array destructuring 31,772 ops/sec [31,079..32,620] → 35,065 ops/sec [34,412..35,544] 🟢 +10.4% 25,016 ops/sec [24,900..26,140] → 25,808 ops/sec [24,207..26,197] ~ overlap (+3.2%)
map with object destructuring 27,915 ops/sec [26,612..28,921] → 30,832 ops/sec [30,053..31,597] 🟢 +10.4% 45,290 ops/sec [44,477..45,992] → 41,393 ops/sec [40,808..42,105] 🔴 -8.6%
map with nested destructuring 23,643 ops/sec [23,060..23,907] → 25,740 ops/sec [25,268..28,127] 🟢 +8.9% 41,171 ops/sec [40,676..41,760] → 38,474 ops/sec [37,861..38,694] 🔴 -6.5%
map with rest in destructuring 17,689 ops/sec [17,343..18,196] → 19,901 ops/sec [19,360..20,168] 🟢 +12.5% 13,357 ops/sec [12,965..13,552] → 13,141 ops/sec [13,056..13,337] ~ overlap (-1.6%)
map with defaults in destructuring 22,217 ops/sec [21,601..22,558] → 24,415 ops/sec [23,666..25,894] 🟢 +9.9% 33,336 ops/sec [33,075..34,040] → 31,414 ops/sec [31,008..32,427] 🔴 -5.8%
fibonacci.js — Interp: 🟢 8 · avg +8.8% · Bytecode: 🔴 2, 6 unch. · avg -0.8%
Benchmark Interpreted Δ Bytecode Δ
recursive fib(15) 112 ops/sec [110..113] → 124 ops/sec [121..125] 🟢 +11.0% 597 ops/sec [581..606] → 570 ops/sec [562..578] 🔴 -4.5%
recursive fib(20) 10 ops/sec [10..10] → 11 ops/sec [11..11] 🟢 +10.9% 53 ops/sec [52..54] → 51 ops/sec [50..51] 🔴 -3.6%
recursive fib(15) typed 114 ops/sec [112..117] → 125 ops/sec [120..131] 🟢 +10.1% 486 ops/sec [482..493] → 478 ops/sec [472..486] ~ overlap (-1.5%)
recursive fib(20) typed 10 ops/sec [10..10] → 11 ops/sec [11..11] 🟢 +10.5% 44 ops/sec [43..44] → 44 ops/sec [44..44] ~ overlap (+0.8%)
iterative fib(20) via reduce 4,840 ops/sec [4,748..4,889] → 5,167 ops/sec [5,125..5,274] 🟢 +6.8% 10,304 ops/sec [10,188..10,382] → 10,647 ops/sec [10,326..10,789] ~ overlap (+3.3%)
iterator fib(20) 3,820 ops/sec [3,805..3,863] → 4,042 ops/sec [3,980..4,156] 🟢 +5.8% 8,428 ops/sec [8,281..8,509] → 8,440 ops/sec [8,342..8,502] ~ overlap (+0.1%)
iterator fib(20) via Iterator.from + take 6,488 ops/sec [6,449..6,497] → 6,999 ops/sec [6,913..7,034] 🟢 +7.9% 9,854 ops/sec [9,715..9,946] → 9,623 ops/sec [9,494..9,869] ~ overlap (-2.3%)
iterator fib(20) last value via reduce 4,741 ops/sec [4,678..4,773] → 5,106 ops/sec [4,999..5,220] 🟢 +7.7% 7,118 ops/sec [7,041..7,195] → 7,181 ops/sec [6,957..7,252] ~ overlap (+0.9%)
float16array.js — Interp: 🟢 28, 🔴 4 · avg +4.4% · Bytecode: 🟢 7, 🔴 14, 11 unch. · avg +1.9%
Benchmark Interpreted Δ Bytecode Δ
new Float16Array(0) 134,208 ops/sec [133,417..136,929] → 148,270 ops/sec [145,994..150,041] 🟢 +10.5% 167,335 ops/sec [151,850..174,725] → 160,240 ops/sec [160,085..160,964] ~ overlap (-4.2%)
new Float16Array(100) 128,588 ops/sec [127,123..129,502] → 140,480 ops/sec [135,903..143,089] 🟢 +9.2% 158,877 ops/sec [154,883..164,642] → 153,754 ops/sec [151,740..155,235] ~ overlap (-3.2%)
new Float16Array(1000) 110,431 ops/sec [109,297..111,898] → 114,069 ops/sec [112,937..114,826] 🟢 +3.3% 122,963 ops/sec [119,265..123,240] → 128,078 ops/sec [127,128..128,622] 🟢 +4.2%
Float16Array.from([...100]) 82,682 ops/sec [81,922..84,333] → 89,460 ops/sec [88,453..89,760] 🟢 +8.2% 96,946 ops/sec [95,407..102,131] → 91,528 ops/sec [90,729..92,044] 🔴 -5.6%
Float16Array.of(1.5, 2.5, 3.5, 4.5, 5.5) 133,617 ops/sec [131,459..134,206] → 144,809 ops/sec [143,926..145,149] 🟢 +8.4% 117,413 ops/sec [112,733..122,060] → 115,008 ops/sec [112,022..116,250] ~ overlap (-2.0%)
new Float16Array(float64Array) 89,361 ops/sec [88,313..89,827] → 94,450 ops/sec [93,493..94,593] 🟢 +5.7% 103,413 ops/sec [100,287..109,044] → 99,084 ops/sec [98,827..99,189] 🔴 -4.2%
sequential write 100 elements 1,524 ops/sec [1,485..1,531] → 1,604 ops/sec [1,583..1,660] 🟢 +5.3% 4,286 ops/sec [4,112..4,425] → 4,212 ops/sec [4,155..4,268] ~ overlap (-1.7%)
sequential read 100 elements 1,655 ops/sec [1,619..1,673] → 1,767 ops/sec [1,757..1,789] 🟢 +6.8% 5,513 ops/sec [5,429..5,603] → 5,312 ops/sec [5,253..5,421] 🔴 -3.6%
write special values (NaN, Inf, -0) 67,302 ops/sec [65,938..67,952] → 73,752 ops/sec [72,627..75,885] 🟢 +9.6% 131,090 ops/sec [128,404..132,669] → 122,569 ops/sec [121,294..123,664] 🔴 -6.5%
Float16Array write 1,493 ops/sec [1,478..1,513] → 1,596 ops/sec [1,588..1,626] 🟢 +6.9% 4,137 ops/sec [4,104..4,204] → 4,299 ops/sec [4,144..4,534] ~ overlap (+3.9%)
Float32Array write 1,545 ops/sec [1,511..1,578] → 1,628 ops/sec [1,619..1,716] 🟢 +5.4% 4,181 ops/sec [4,129..4,232] → 4,420 ops/sec [4,339..4,512] 🟢 +5.7%
Float64Array write 1,512 ops/sec [1,484..1,531] → 1,612 ops/sec [1,604..1,624] 🟢 +6.6% 4,189 ops/sec [4,120..4,203] → 4,301 ops/sec [4,147..4,336] ~ overlap (+2.7%)
Float16Array read 1,594 ops/sec [1,582..1,609] → 1,720 ops/sec [1,696..1,736] 🟢 +7.9% 5,170 ops/sec [5,108..5,242] → 5,391 ops/sec [5,290..5,500] 🟢 +4.3%
Float32Array read 1,628 ops/sec [1,602..1,643] → 1,718 ops/sec [1,704..1,730] 🟢 +5.5% 5,541 ops/sec [5,428..5,573] → 5,447 ops/sec [5,391..5,495] ~ overlap (-1.7%)
Float64Array read 1,681 ops/sec [1,597..1,695] → 1,740 ops/sec [1,707..1,768] 🟢 +3.5% 5,584 ops/sec [5,531..5,721] → 5,480 ops/sec [5,454..5,603] ~ overlap (-1.9%)
fill(1.5) 22,076 ops/sec [21,558..22,557] → 23,702 ops/sec [23,264..24,587] 🟢 +7.4% 24,146 ops/sec [24,034..24,345] → 22,924 ops/sec [22,716..23,400] 🔴 -5.1%
slice() 88,342 ops/sec [87,665..89,218] → 90,222 ops/sec [89,438..92,361] 🟢 +2.1% 98,644 ops/sec [97,642..99,011] → 95,152 ops/sec [94,337..95,670] 🔴 -3.5%
map(x => x * 2) 2,741 ops/sec [2,564..2,757] → 2,997 ops/sec [2,908..3,045] 🟢 +9.3% 4,067 ops/sec [3,973..4,147] → 4,003 ops/sec [3,943..4,045] ~ overlap (-1.6%)
filter(x => x > 25) 2,903 ops/sec [2,886..2,943] → 3,156 ops/sec [3,150..3,161] 🟢 +8.7% 4,605 ops/sec [4,533..4,659] → 4,421 ops/sec [4,354..4,497] 🔴 -4.0%
reduce (sum) 2,760 ops/sec [2,749..2,774] → 3,008 ops/sec [2,949..3,099] 🟢 +9.0% 3,754 ops/sec [3,705..3,881] → 3,661 ops/sec [3,593..3,675] 🔴 -2.5%
sort() 20,687 ops/sec [20,611..20,752] → 17,598 ops/sec [17,521..17,677] 🔴 -14.9% 17,779 ops/sec [17,702..18,013] → 24,733 ops/sec [24,191..25,449] 🟢 +39.1%
indexOf() 108,914 ops/sec [108,085..109,276] → 99,687 ops/sec [98,578..100,253] 🔴 -8.5% 112,795 ops/sec [112,087..114,324] → 142,768 ops/sec [140,026..145,280] 🟢 +26.6%
reverse() 112,008 ops/sec [110,279..113,745] → 118,193 ops/sec [117,395..120,306] 🟢 +5.5% 134,500 ops/sec [133,895..136,205] → 128,172 ops/sec [127,398..130,821] 🔴 -4.7%
toReversed() 54,947 ops/sec [54,552..55,307] → 50,791 ops/sec [49,442..51,436] 🔴 -7.6% 54,193 ops/sec [53,439..54,624] → 64,501 ops/sec [64,401..64,642] 🟢 +19.0%
toSorted() 812 ops/sec [808..814] → 690 ops/sec [684..699] 🔴 -15.0% 694 ops/sec [684..697] → 938 ops/sec [932..941] 🟢 +35.2%
create view over existing buffer 161,971 ops/sec [158,342..163,958] → 168,274 ops/sec [166,134..171,825] 🟢 +3.9% 189,765 ops/sec [188,606..200,367] → 188,703 ops/sec [187,340..190,229] ~ overlap (-0.6%)
subarray() 187,042 ops/sec [185,342..188,871] → 202,370 ops/sec [199,833..204,033] 🟢 +8.2% 272,428 ops/sec [266,066..276,026] → 259,558 ops/sec [258,756..260,756] 🔴 -4.7%
set() from array 215,879 ops/sec [211,011..218,700] → 232,527 ops/sec [230,440..235,782] 🟢 +7.7% 302,954 ops/sec [301,285..304,612] → 272,781 ops/sec [272,053..273,094] 🔴 -10.0%
for-of loop 2,446 ops/sec [2,395..2,489] → 2,544 ops/sec [2,533..2,565] 🟢 +4.0% 7,626 ops/sec [7,557..7,822] → 7,515 ops/sec [7,476..7,616] ~ overlap (-1.5%)
spread into array 9,022 ops/sec [8,969..9,179] → 9,527 ops/sec [9,294..9,793] 🟢 +5.6% 38,139 ops/sec [37,800..38,580] → 36,551 ops/sec [36,319..36,738] 🔴 -4.2%
f16round(1.337) 268,489 ops/sec [265,034..270,837] → 288,204 ops/sec [284,354..302,499] 🟢 +7.3% 305,541 ops/sec [304,786..310,452] → 302,422 ops/sec [300,606..303,682] 🔴 -1.0%
f16round over 100 values 1,707 ops/sec [1,659..1,740] → 1,773 ops/sec [1,742..1,923] 🟢 +3.9% 3,677 ops/sec [3,664..3,733] → 3,580 ops/sec [3,535..3,634] 🔴 -2.6%
for-of.js — Interp: 🟢 1, 6 unch. · avg +0.7% · Bytecode: 7 unch. · avg +0.2%
Benchmark Interpreted Δ Bytecode Δ
for...of with 10-element array 22,303 ops/sec [22,044..22,552] → 22,753 ops/sec [22,498..22,895] ~ overlap (+2.0%) 94,889 ops/sec [94,359..96,315] → 98,300 ops/sec [90,797..99,746] ~ overlap (+3.6%)
for...of with 100-element array 2,663 ops/sec [2,633..2,695] → 2,642 ops/sec [2,595..2,654] ~ overlap (-0.8%) 11,427 ops/sec [11,356..11,494] → 11,463 ops/sec [11,342..11,629] ~ overlap (+0.3%)
for...of with string (10 chars) 16,315 ops/sec [16,051..16,630] → 16,235 ops/sec [15,898..16,718] ~ overlap (-0.5%) 37,104 ops/sec [37,009..37,245] → 35,454 ops/sec [34,448..37,458] ~ overlap (-4.4%)
for...of with Set (10 elements) 22,907 ops/sec [22,463..24,048] → 22,963 ops/sec [22,505..23,563] ~ overlap (+0.2%) 94,445 ops/sec [93,732..96,069] → 94,490 ops/sec [92,852..94,925] ~ overlap (+0.0%)
for...of with Map entries (10 entries) 15,078 ops/sec [14,969..15,139] → 15,340 ops/sec [15,145..15,714] 🟢 +1.7% 16,503 ops/sec [15,989..16,866] → 16,994 ops/sec [16,403..17,837] ~ overlap (+3.0%)
for...of with destructuring 19,047 ops/sec [18,733..19,367] → 19,055 ops/sec [18,873..19,098] ~ overlap (+0.0%) 21,333 ops/sec [21,077..21,650] → 21,588 ops/sec [21,098..21,865] ~ overlap (+1.2%)
for-await-of with sync array 21,532 ops/sec [21,263..21,723] → 21,936 ops/sec [21,503..22,254] ~ overlap (+1.9%) 18,147 ops/sec [17,845..18,422] → 17,694 ops/sec [17,354..18,175] ~ overlap (-2.5%)
generators.js — Interp: 🟢 4 · avg +13.9% · Bytecode: 🔴 4 · avg -8.1%
Benchmark Interpreted Δ Bytecode Δ
manual next over object generator 897 ops/sec [893..914] → 1,029 ops/sec [1,001..1,053] 🟢 +14.8% 983 ops/sec [977..993] → 900 ops/sec [879..908] 🔴 -8.4%
for...of over object generator 1,463 ops/sec [1,434..1,464] → 1,686 ops/sec [1,670..1,713] 🟢 +15.2% 1,516 ops/sec [1,503..1,521] → 1,358 ops/sec [1,336..1,373] 🔴 -10.4%
yield delegation 1,494 ops/sec [1,472..1,511] → 1,679 ops/sec [1,669..1,695] 🟢 +12.3% 1,526 ops/sec [1,510..1,539] → 1,409 ops/sec [1,394..1,431] 🔴 -7.7%
class generator method 1,485 ops/sec [1,480..1,500] → 1,681 ops/sec [1,586..1,695] 🟢 +13.2% 1,482 ops/sec [1,452..1,517] → 1,394 ops/sec [1,378..1,404] 🔴 -6.0%
iterators.js — Interp: 🟢 36, 6 unch. · avg +7.0% · Bytecode: 🟢 15, 🔴 9, 18 unch. · avg +2.1%
Benchmark Interpreted Δ Bytecode Δ
Iterator.from({next}).toArray() — 20 elements 5,841 ops/sec [5,747..5,874] → 6,097 ops/sec [6,002..6,165] 🟢 +4.4% 9,581 ops/sec [9,426..9,629] → 9,194 ops/sec [9,157..9,300] 🔴 -4.0%
Iterator.from({next}).toArray() — 50 elements 2,499 ops/sec [2,458..2,551] → 2,651 ops/sec [2,639..2,663] 🟢 +6.1% 4,266 ops/sec [4,224..4,285] → 4,179 ops/sec [4,092..4,232] ~ overlap (-2.0%)
spread pre-wrapped iterator — 20 elements 4,760 ops/sec [4,585..4,847] → 5,041 ops/sec [5,007..5,219] 🟢 +5.9% 9,260 ops/sec [9,187..9,319] → 9,261 ops/sec [9,166..9,429] ~ overlap (+0.0%)
Iterator.from({next}).forEach — 50 elements 1,721 ops/sec [1,673..1,731] → 1,810 ops/sec [1,786..1,845] 🟢 +5.2% 2,908 ops/sec [2,887..2,924] → 2,899 ops/sec [2,851..2,910] ~ overlap (-0.3%)
Iterator.from({next}).reduce — 50 elements 1,756 ops/sec [1,727..1,801] → 1,875 ops/sec [1,788..1,894] ~ overlap (+6.8%) 2,824 ops/sec [2,713..2,853] → 2,799 ops/sec [2,772..2,839] ~ overlap (-0.9%)
wrap array iterator 76,933 ops/sec [74,947..78,958] → 83,013 ops/sec [80,472..84,839] 🟢 +7.9% 86,664 ops/sec [85,921..87,575] → 84,948 ops/sec [84,345..87,482] ~ overlap (-2.0%)
wrap plain {next()} object 4,073 ops/sec [3,959..4,149] → 4,322 ops/sec [4,295..4,377] 🟢 +6.1% 6,937 ops/sec [6,851..7,103] → 6,626 ops/sec [6,508..6,645] 🔴 -4.5%
map + toArray (50 elements) 1,782 ops/sec [1,768..1,788] → 1,878 ops/sec [1,860..1,895] 🟢 +5.3% 2,992 ops/sec [2,978..3,022] → 2,913 ops/sec [2,864..2,937] 🔴 -2.7%
filter + toArray (50 elements) 1,737 ops/sec [1,728..1,749] → 1,863 ops/sec [1,820..1,881] 🟢 +7.3% 3,024 ops/sec [2,995..3,063] → 2,823 ops/sec [2,796..2,839] 🔴 -6.6%
take(10) + toArray (50 element source) 11,048 ops/sec [10,839..11,141] → 11,774 ops/sec [11,632..11,975] 🟢 +6.6% 17,417 ops/sec [17,344..17,462] → 17,380 ops/sec [16,991..17,516] ~ overlap (-0.2%)
drop(40) + toArray (50 element source) 2,522 ops/sec [2,512..2,529] → 2,698 ops/sec [2,635..2,792] 🟢 +7.0% 4,321 ops/sec [4,283..4,380] → 4,130 ops/sec [4,045..4,251] 🔴 -4.4%
chained map + filter + take (100 element source) 3,359 ops/sec [3,226..3,526] → 3,403 ops/sec [3,235..3,548] ~ overlap (+1.3%) 5,305 ops/sec [4,991..5,439] → 4,944 ops/sec [4,922..4,981] 🔴 -6.8%
some + every (50 elements) 1,000 ops/sec [990..1,016] → 1,079 ops/sec [1,050..1,093] 🟢 +7.9% 1,742 ops/sec [1,706..1,842] → 1,628 ops/sec [1,620..1,694] 🔴 -6.6%
find (50 elements) 2,245 ops/sec [2,180..2,275] → 2,380 ops/sec [2,342..2,448] 🟢 +6.0% 3,736 ops/sec [3,696..3,793] → 3,593 ops/sec [3,540..3,660] 🔴 -3.8%
concat 2 arrays (10 + 10 elements) 72,713 ops/sec [70,828..75,055] → 77,721 ops/sec [76,590..78,847] 🟢 +6.9% 80,869 ops/sec [78,810..81,653] → 82,656 ops/sec [80,487..83,796] ~ overlap (+2.2%)
concat 5 arrays (10 elements each) 43,181 ops/sec [41,597..45,052] → 46,328 ops/sec [45,686..46,967] 🟢 +7.3% 47,365 ops/sec [46,754..47,713] → 48,260 ops/sec [47,435..50,404] ~ overlap (+1.9%)
concat 2 arrays (20 + 20 elements) 63,845 ops/sec [61,074..65,264] → 68,140 ops/sec [67,264..69,867] 🟢 +6.7% 69,042 ops/sec [67,539..70,181] → 70,156 ops/sec [68,566..71,611] ~ overlap (+1.6%)
concat + filter + toArray (20 + 20 elements) 6,223 ops/sec [6,066..6,349] → 6,799 ops/sec [6,676..6,880] 🟢 +9.3% 10,344 ops/sec [10,248..10,538] → 10,012 ops/sec [9,644..10,487] ~ overlap (-3.2%)
concat + map + take (20 + 20 elements, take 10) 19,377 ops/sec [19,034..20,257] → 21,753 ops/sec [21,043..22,212] 🟢 +12.3% 28,206 ops/sec [27,656..29,324] → 29,002 ops/sec [27,825..29,287] ~ overlap (+2.8%)
concat Sets (15 + 15 elements) 69,759 ops/sec [68,178..70,072] → 74,937 ops/sec [69,256..76,719] ~ overlap (+7.4%) 76,604 ops/sec [74,486..78,104] → 76,768 ops/sec [74,028..79,568] ~ overlap (+0.2%)
concat strings (13 + 13 characters) 49,098 ops/sec [48,478..50,605] → 53,919 ops/sec [52,535..54,255] 🟢 +9.8% 50,287 ops/sec [49,524..51,498] → 51,973 ops/sec [50,381..52,912] ~ overlap (+3.4%)
zip 2 arrays (10 + 10 elements) 28,766 ops/sec [28,508..28,884] → 30,654 ops/sec [29,839..30,990] 🟢 +6.6% 30,296 ops/sec [30,122..30,660] → 31,844 ops/sec [31,406..32,330] 🟢 +5.1%
zip 3 arrays (10 elements each) 26,355 ops/sec [25,734..26,735] → 28,477 ops/sec [27,792..29,369] 🟢 +8.1% 26,538 ops/sec [26,177..27,562] → 28,656 ops/sec [28,421..29,396] 🟢 +8.0%
zip 2 arrays (20 + 20 elements) 18,952 ops/sec [18,650..19,104] → 20,187 ops/sec [19,891..21,111] 🟢 +6.5% 18,867 ops/sec [18,741..18,997] → 20,577 ops/sec [20,459..20,867] 🟢 +9.1%
zip 2 arrays (50 + 50 elements) 9,634 ops/sec [9,417..9,799] → 10,487 ops/sec [10,102..11,163] 🟢 +8.9% 9,606 ops/sec [9,466..9,787] → 10,444 ops/sec [10,309..10,604] 🟢 +8.7%
zip shortest mode (20 + 10 elements) 28,619 ops/sec [28,300..29,019] → 30,881 ops/sec [29,764..31,607] 🟢 +7.9% 29,317 ops/sec [28,718..29,476] → 31,344 ops/sec [31,135..31,791] 🟢 +6.9%
zip longest mode (10 + 20 elements) 17,011 ops/sec [16,915..17,310] → 18,124 ops/sec [17,712..18,514] 🟢 +6.5% 17,137 ops/sec [16,418..17,369] → 18,695 ops/sec [18,640..18,808] 🟢 +9.1%
zip strict mode (20 + 20 elements) 18,807 ops/sec [18,474..19,069] → 19,256 ops/sec [19,146..19,416] 🟢 +2.4% 18,076 ops/sec [18,008..18,299] → 19,258 ops/sec [19,137..20,471] 🟢 +6.5%
zip + map + toArray (20 + 20 elements) 7,600 ops/sec [7,516..7,847] → 8,118 ops/sec [7,941..8,173] 🟢 +6.8% 5,867 ops/sec [5,812..5,935] → 6,347 ops/sec [6,245..6,360] 🟢 +8.2%
zip + filter + toArray (20 + 20 elements) 7,391 ops/sec [7,264..7,583] → 7,802 ops/sec [7,645..7,840] 🟢 +5.6% 5,856 ops/sec [5,749..5,962] → 6,384 ops/sec [6,110..6,408] 🟢 +9.0%
zip Sets (15 + 15 elements) 23,550 ops/sec [23,086..23,768] → 24,984 ops/sec [24,927..25,016] 🟢 +6.1% 23,025 ops/sec [22,943..24,055] → 25,503 ops/sec [25,305..25,602] 🟢 +10.8%
zipKeyed 2 keys (10 elements each) 29,721 ops/sec [29,142..30,802] → 31,066 ops/sec [30,646..31,307] ~ overlap (+4.5%) 30,130 ops/sec [29,779..30,621] → 30,601 ops/sec [30,207..31,084] ~ overlap (+1.6%)
zipKeyed 3 keys (20 elements each) 14,617 ops/sec [14,434..15,027] → 15,893 ops/sec [15,699..16,164] 🟢 +8.7% 15,258 ops/sec [14,910..15,698] → 15,946 ops/sec [15,710..16,041] 🟢 +4.5%
zipKeyed longest mode (10 + 20 elements) 17,190 ops/sec [16,969..17,448] → 18,081 ops/sec [17,410..18,125] ~ overlap (+5.2%) 17,065 ops/sec [16,769..17,289] → 18,443 ops/sec [18,183..18,636] 🟢 +8.1%
zipKeyed strict mode (20 + 20 elements) 17,986 ops/sec [17,586..18,158] → 18,758 ops/sec [18,014..19,113] ~ overlap (+4.3%) 17,680 ops/sec [17,373..18,256] → 19,693 ops/sec [19,558..19,764] 🟢 +11.4%
zipKeyed + filter + map (20 elements) 5,429 ops/sec [5,297..5,523] → 6,081 ops/sec [5,994..6,207] 🟢 +12.0% 7,512 ops/sec [7,447..7,894] → 7,832 ops/sec [7,792..7,874] ~ overlap (+4.3%)
array.values().map().filter().toArray() 2,955 ops/sec [2,924..2,965] → 3,232 ops/sec [3,168..3,245] 🟢 +9.4% 4,988 ops/sec [4,929..5,100] → 5,000 ops/sec [4,950..5,090] ~ overlap (+0.2%)
array.values().take(5).toArray() 99,392 ops/sec [97,849..101,579] → 104,236 ops/sec [103,162..105,005] 🟢 +4.9% 116,747 ops/sec [115,823..118,262] → 119,388 ops/sec [117,372..120,257] ~ overlap (+2.3%)
array.values().drop(45).toArray() 79,685 ops/sec [78,134..80,391] → 85,345 ops/sec [84,254..85,449] 🟢 +7.1% 94,609 ops/sec [93,265..95,829] → 96,853 ops/sec [94,535..97,812] ~ overlap (+2.4%)
map.entries() chained helpers 4,236 ops/sec [4,170..4,327] → 4,652 ops/sec [4,583..4,781] 🟢 +9.8% 3,106 ops/sec [3,039..3,147] → 3,338 ops/sec [3,311..3,369] 🟢 +7.5%
set.values() chained helpers 6,370 ops/sec [6,235..6,397] → 6,947 ops/sec [6,808..7,014] 🟢 +9.0% 10,896 ops/sec [10,756..11,036] → 10,571 ops/sec [10,353..10,688] 🔴 -3.0%
string iterator map + toArray 5,267 ops/sec [5,212..5,363] → 5,884 ops/sec [5,805..5,986] 🟢 +11.7% 6,649 ops/sec [6,618..6,733] → 6,876 ops/sec [6,832..6,971] 🟢 +3.4%
json.js — Interp: 🟢 20 · avg +9.2% · Bytecode: 🔴 20 · avg -11.3%
Benchmark Interpreted Δ Bytecode Δ
parse simple object 71,810 ops/sec [69,951..74,374] → 77,672 ops/sec [77,105..79,855] 🟢 +8.2% 85,329 ops/sec [84,451..86,759] → 74,242 ops/sec [73,736..74,884] 🔴 -13.0%
parse nested object 47,391 ops/sec [46,101..48,144] → 51,620 ops/sec [51,012..52,463] 🟢 +8.9% 55,282 ops/sec [54,622..58,035] → 47,444 ops/sec [47,209..47,526] 🔴 -14.2%
parse array of objects 27,973 ops/sec [27,364..28,511] → 29,876 ops/sec [29,266..30,082] 🟢 +6.8% 32,924 ops/sec [31,497..33,466] → 28,869 ops/sec [28,534..28,948] 🔴 -12.3%
parse large flat object 29,505 ops/sec [28,711..30,425] → 31,974 ops/sec [31,445..32,806] 🟢 +8.4% 34,298 ops/sec [33,671..34,941] → 30,605 ops/sec [30,480..30,760] 🔴 -10.8%
parse mixed types 34,747 ops/sec [33,775..35,360] → 38,428 ops/sec [37,794..40,042] 🟢 +10.6% 41,231 ops/sec [40,061..41,679] → 37,798 ops/sec [36,971..37,988] 🔴 -8.3%
stringify simple object 75,870 ops/sec [75,298..75,940] → 84,277 ops/sec [83,652..84,976] 🟢 +11.1% 86,290 ops/sec [84,612..87,289] → 80,490 ops/sec [77,674..81,804] 🔴 -6.7%
stringify nested object 44,216 ops/sec [43,595..44,637] → 48,798 ops/sec [48,163..49,249] 🟢 +10.4% 47,889 ops/sec [47,631..48,266] → 44,144 ops/sec [43,303..44,411] 🔴 -7.8%
stringify array of objects 18,602 ops/sec [18,083..19,008] → 20,477 ops/sec [19,922..21,013] 🟢 +10.1% 22,964 ops/sec [21,333..24,355] → 19,755 ops/sec [19,571..20,053] 🔴 -14.0%
stringify mixed types 28,921 ops/sec [28,530..29,334] → 31,922 ops/sec [31,785..32,094] 🟢 +10.4% 33,745 ops/sec [32,435..34,588] → 28,203 ops/sec [28,066..28,503] 🔴 -16.4%
reviver doubles numbers 13,899 ops/sec [13,714..14,066] → 15,018 ops/sec [14,896..15,309] 🟢 +8.0% 21,559 ops/sec [21,305..21,894] → 18,165 ops/sec [17,997..18,307] 🔴 -15.7%
reviver filters properties 11,487 ops/sec [11,238..11,815] → 12,568 ops/sec [12,416..12,740] 🟢 +9.4% 19,768 ops/sec [17,586..20,061] → 16,103 ops/sec [15,988..16,179] 🔴 -18.5%
reviver on nested object 16,167 ops/sec [15,702..16,338] → 17,589 ops/sec [17,398..17,732] 🟢 +8.8% 21,881 ops/sec [21,447..22,270] → 19,383 ops/sec [18,950..19,434] 🔴 -11.4%
reviver on array 8,507 ops/sec [8,496..8,582] → 9,426 ops/sec [9,249..9,508] 🟢 +10.8% 12,569 ops/sec [12,388..12,708] → 11,198 ops/sec [11,125..11,262] 🔴 -10.9%
replacer function doubles numbers 16,080 ops/sec [15,810..16,206] → 17,334 ops/sec [17,204..17,487] 🟢 +7.8% 24,539 ops/sec [24,172..24,860] → 21,983 ops/sec [21,470..22,174] 🔴 -10.4%
replacer function excludes properties 21,490 ops/sec [21,232..21,726] → 23,306 ops/sec [23,068..23,722] 🟢 +8.5% 29,131 ops/sec [29,018..29,540] → 26,102 ops/sec [25,348..26,718] 🔴 -10.4%
array replacer (allowlist) 47,296 ops/sec [46,774..47,581] → 51,760 ops/sec [50,807..52,618] 🟢 +9.4% 50,605 ops/sec [49,719..51,517] → 45,688 ops/sec [44,177..46,064] 🔴 -9.7%
stringify with 2-space indent 38,502 ops/sec [37,231..39,578] → 42,277 ops/sec [41,118..43,895] 🟢 +9.8% 42,716 ops/sec [41,853..43,357] → 40,562 ops/sec [40,321..40,829] 🔴 -5.0%
stringify with tab indent 38,819 ops/sec [38,777..38,956] → 41,849 ops/sec [41,408..43,137] 🟢 +7.8% 41,573 ops/sec [41,074..42,226] → 38,780 ops/sec [37,837..39,242] 🔴 -6.7%
parse then stringify 23,712 ops/sec [23,200..23,802] → 25,261 ops/sec [24,981..25,585] 🟢 +6.5% 27,183 ops/sec [26,903..27,806] → 24,676 ops/sec [24,482..24,851] 🔴 -9.2%
stringify then parse 13,710 ops/sec [13,346..14,153] → 15,274 ops/sec [15,035..15,482] 🟢 +11.4% 16,484 ops/sec [15,952..16,741] → 14,169 ops/sec [13,972..14,251] 🔴 -14.0%
jsx.jsx — Interp: 🟢 21 · avg +7.6% · Bytecode: 🔴 14, 7 unch. · avg -5.1%
Benchmark Interpreted Δ Bytecode Δ
simple element 94,533 ops/sec [93,877..99,463] → 103,770 ops/sec [102,893..104,615] 🟢 +9.8% 152,315 ops/sec [150,457..153,572] → 148,078 ops/sec [146,763..151,770] ~ overlap (-2.8%)
self-closing element 99,060 ops/sec [97,508..100,303] → 106,735 ops/sec [104,544..108,514] 🟢 +7.7% 171,283 ops/sec [168,649..173,278] → 169,048 ops/sec [163,766..172,514] ~ overlap (-1.3%)
element with string attribute 84,683 ops/sec [82,260..86,670] → 89,242 ops/sec [87,458..89,556] 🟢 +5.4% 125,925 ops/sec [123,717..128,743] → 123,146 ops/sec [117,065..125,400] ~ overlap (-2.2%)
element with multiple attributes 74,495 ops/sec [73,608..75,243] → 79,661 ops/sec [78,417..80,023] 🟢 +6.9% 95,699 ops/sec [94,710..98,077] → 90,468 ops/sec [89,130..93,106] 🔴 -5.5%
element with expression attribute 83,503 ops/sec [79,495..84,326] → 86,028 ops/sec [84,563..86,281] 🟢 +3.0% 124,465 ops/sec [122,813..126,527] → 120,699 ops/sec [119,825..122,180] 🔴 -3.0%
text child 101,678 ops/sec [99,936..101,964] → 116,777 ops/sec [115,781..117,796] 🟢 +14.8% 160,597 ops/sec [156,928..164,426] → 149,049 ops/sec [146,142..149,919] 🔴 -7.2%
expression child 98,911 ops/sec [96,823..99,775] → 107,311 ops/sec [106,774..111,335] 🟢 +8.5% 153,069 ops/sec [152,582..157,013] → 148,131 ops/sec [147,171..148,756] 🔴 -3.2%
mixed text and expression 99,482 ops/sec [97,169..99,719] → 104,951 ops/sec [103,953..109,336] 🟢 +5.5% 136,792 ops/sec [132,992..140,234] → 129,950 ops/sec [128,588..131,380] 🔴 -5.0%
nested elements (3 levels) 37,594 ops/sec [37,121..37,672] → 40,733 ops/sec [40,058..46,033] 🟢 +8.3% 59,952 ops/sec [57,923..60,847] → 57,352 ops/sec [54,548..59,310] ~ overlap (-4.3%)
sibling children 27,875 ops/sec [27,622..28,803] → 30,629 ops/sec [29,749..30,869] 🟢 +9.9% 43,456 ops/sec [42,744..44,032] → 40,840 ops/sec [40,078..41,194] 🔴 -6.0%
component element 74,473 ops/sec [72,184..75,061] → 77,511 ops/sec [76,370..79,238] 🟢 +4.1% 110,320 ops/sec [108,768..115,116] → 111,957 ops/sec [111,030..112,821] ~ overlap (+1.5%)
component with children 45,530 ops/sec [45,193..46,157] → 47,951 ops/sec [46,737..48,465] 🟢 +5.3% 70,625 ops/sec [68,447..71,024] → 64,002 ops/sec [62,984..65,511] 🔴 -9.4%
dotted component 63,065 ops/sec [62,771..63,107] → 67,305 ops/sec [66,253..69,240] 🟢 +6.7% 87,842 ops/sec [87,532..88,957] → 85,078 ops/sec [82,157..87,122] 🔴 -3.1%
empty fragment 101,921 ops/sec [100,837..102,139] → 107,329 ops/sec [105,274..111,656] 🟢 +5.3% 188,525 ops/sec [184,746..191,112] → 185,443 ops/sec [182,464..187,612] ~ overlap (-1.6%)
fragment with children 28,351 ops/sec [28,055..28,561] → 30,435 ops/sec [29,832..30,877] 🟢 +7.4% 43,476 ops/sec [42,919..44,280] → 43,758 ops/sec [40,737..44,250] ~ overlap (+0.6%)
spread attributes 53,781 ops/sec [53,474..53,961] → 58,318 ops/sec [57,799..59,146] 🟢 +8.4% 67,927 ops/sec [67,216..68,369] → 60,897 ops/sec [60,126..61,283] 🔴 -10.3%
spread with overrides 47,550 ops/sec [46,962..48,774] → 51,891 ops/sec [50,936..52,743] 🟢 +9.1% 58,492 ops/sec [58,047..59,071] → 53,733 ops/sec [53,478..53,954] 🔴 -8.1%
shorthand props 77,044 ops/sec [75,501..77,526] → 83,360 ops/sec [81,240..83,951] 🟢 +8.2% 117,167 ops/sec [114,076..118,746] → 104,806 ops/sec [104,525..105,255] 🔴 -10.5%
nav bar structure 13,591 ops/sec [13,400..13,759] → 14,669 ops/sec [14,574..14,717] 🟢 +7.9% 20,305 ops/sec [20,199..20,510] → 18,252 ops/sec [17,825..18,497] 🔴 -10.1%
card component tree 15,685 ops/sec [15,657..15,811] → 16,983 ops/sec [16,737..17,250] 🟢 +8.3% 22,570 ops/sec [22,254..22,837] → 20,619 ops/sec [20,544..20,886] 🔴 -8.6%
10 list items via Array.from 7,057 ops/sec [6,943..7,113] → 7,615 ops/sec [7,556..7,759] 🟢 +7.9% 9,789 ops/sec [9,708..9,843] → 9,124 ops/sec [9,072..9,194] 🔴 -6.8%
modules.js — Interp: 🟢 9 · avg +9.1% · Bytecode: 🔴 9 · avg -8.1%
Benchmark Interpreted Δ Bytecode Δ
call imported function 161,200 ops/sec [136,611..167,562] → 178,549 ops/sec [176,134..182,872] 🟢 +10.8% 778,056 ops/sec [761,628..795,051] → 697,467 ops/sec [677,574..714,451] 🔴 -10.4%
call two imported functions 92,065 ops/sec [90,205..93,089] → 102,864 ops/sec [100,875..104,489] 🟢 +11.7% 503,842 ops/sec [487,631..516,418] → 446,808 ops/sec [439,673..452,243] 🔴 -11.3%
read imported constant 537,084 ops/sec [519,882..545,390] → 579,480 ops/sec [566,065..599,777] 🟢 +7.9% 2,023,451 ops/sec [2,007,916..2,048,347] → 1,878,007 ops/sec [1,829,263..1,886,741] 🔴 -7.2%
read imported string 528,561 ops/sec [520,550..551,757] → 569,308 ops/sec [558,567..575,183] 🟢 +7.7% 2,029,060 ops/sec [2,019,549..2,033,342] → 1,873,227 ops/sec [1,840,900..1,907,207] 🔴 -7.7%
read JSON string property 546,242 ops/sec [524,999..555,430] → 608,088 ops/sec [585,158..630,709] 🟢 +11.3% 2,007,125 ops/sec [1,974,364..2,079,647] → 1,884,598 ops/sec [1,851,814..1,891,907] 🔴 -6.1%
read JSON number property 533,714 ops/sec [512,085..541,571] → 589,125 ops/sec [570,057..615,181] 🟢 +10.4% 2,029,338 ops/sec [2,015,899..2,046,243] → 1,883,443 ops/sec [1,862,664..1,903,132] 🔴 -7.2%
read JSON boolean property 538,608 ops/sec [525,541..543,099] → 580,470 ops/sec [578,188..589,970] 🟢 +7.8% 2,005,112 ops/sec [1,990,910..2,076,371] → 1,883,745 ops/sec [1,870,286..1,906,106] 🔴 -6.1%
read JSON array property 530,219 ops/sec [514,567..541,614] → 566,212 ops/sec [550,595..572,183] 🟢 +6.8% 2,007,715 ops/sec [2,001,552..2,035,440] → 1,888,605 ops/sec [1,852,274..1,896,192] 🔴 -5.9%
read multiple JSON properties 336,267 ops/sec [327,510..343,401] → 362,567 ops/sec [347,572..365,636] 🟢 +7.8% 1,670,227 ops/sec [1,631,801..1,686,518] → 1,479,853 ops/sec [1,477,349..1,488,505] 🔴 -11.4%
numbers.js — Interp: 🟢 9, 2 unch. · avg +6.5% · Bytecode: 🟢 1, 🔴 9, 1 unch. · avg -6.2%
Benchmark Interpreted Δ Bytecode Δ
integer arithmetic 177,926 ops/sec [174,596..182,381] → 190,939 ops/sec [188,394..192,688] 🟢 +7.3% 720,400 ops/sec [691,211..733,129] → 687,894 ops/sec [677,176..694,872] ~ overlap (-4.5%)
floating point arithmetic 207,158 ops/sec [206,561..212,177] → 223,257 ops/sec [221,143..225,298] 🟢 +7.8% 391,821 ops/sec [374,455..399,791] → 436,368 ops/sec [430,938..439,183] 🟢 +11.4%
number coercion 76,316 ops/sec [73,481..77,585] → 81,936 ops/sec [79,705..84,393] 🟢 +7.4% 100,810 ops/sec [96,715..103,422] → 94,436 ops/sec [93,795..95,553] 🔴 -6.3%
toFixed 50,946 ops/sec [50,301..52,165] → 54,311 ops/sec [53,407..55,140] 🟢 +6.6% 60,402 ops/sec [59,770..60,759] → 55,318 ops/sec [53,800..56,789] 🔴 -8.4%
toString 67,200 ops/sec [65,942..68,540] → 68,866 ops/sec [68,283..69,099] ~ overlap (+2.5%) 83,709 ops/sec [81,654..84,209] → 78,415 ops/sec [73,518..79,365] 🔴 -6.3%
valueOf 100,105 ops/sec [98,635..100,690] → 105,770 ops/sec [103,456..107,440] 🟢 +5.7% 131,061 ops/sec [127,310..132,851] → 120,031 ops/sec [119,186..122,018] 🔴 -8.4%
toPrecision 43,427 ops/sec [42,846..44,425] → 45,252 ops/sec [43,892..46,645] ~ overlap (+4.2%) 49,340 ops/sec [47,158..51,184] → 45,320 ops/sec [43,691..46,154] 🔴 -8.1%
Number.isNaN 122,628 ops/sec [117,706..123,240] → 128,720 ops/sec [127,847..133,639] 🟢 +5.0% 141,042 ops/sec [137,055..145,587] → 124,102 ops/sec [121,997..126,951] 🔴 -12.0%
Number.isFinite 118,997 ops/sec [115,333..120,234] → 128,846 ops/sec [126,982..136,942] 🟢 +8.3% 132,481 ops/sec [129,697..143,266] → 122,060 ops/sec [119,899..123,096] 🔴 -7.9%
Number.isInteger 121,404 ops/sec [120,857..121,925] → 133,537 ops/sec [132,807..133,888] 🟢 +10.0% 141,579 ops/sec [140,380..155,923] → 131,181 ops/sec [129,883..131,607] 🔴 -7.3%
Number.parseInt and parseFloat 99,135 ops/sec [98,549..101,110] → 105,713 ops/sec [104,138..109,355] 🟢 +6.6% 107,988 ops/sec [105,547..113,620] → 97,199 ops/sec [96,516..98,953] 🔴 -10.0%
objects.js — Interp: 🟢 7 · avg +15.1% · Bytecode: 🔴 6, 1 unch. · avg -11.1%
Benchmark Interpreted Δ Bytecode Δ
create simple object 210,727 ops/sec [205,319..214,895] → 233,402 ops/sec [231,054..238,288] 🟢 +10.8% 288,323 ops/sec [286,339..289,383] → 247,551 ops/sec [246,471..249,383] 🔴 -14.1%
create nested object 110,055 ops/sec [106,855..111,884] → 127,621 ops/sec [124,116..129,145] 🟢 +16.0% 125,110 ops/sec [124,509..126,182] → 109,514 ops/sec [109,100..109,960] 🔴 -12.5%
create 50 objects via Array.from 4,082 ops/sec [4,020..4,122] → 4,560 ops/sec [4,496..4,588] 🟢 +11.7% 4,964 ops/sec [4,924..4,982] → 4,480 ops/sec [4,423..4,490] 🔴 -9.7%
property read 204,201 ops/sec [197,869..208,935] → 230,946 ops/sec [227,788..241,886] 🟢 +13.1% 335,897 ops/sec [333,082..342,516] → 285,668 ops/sec [284,934..298,861] 🔴 -15.0%
Object.keys 117,485 ops/sec [114,741..119,452] → 139,714 ops/sec [138,540..143,015] 🟢 +18.9% 155,003 ops/sec [154,155..155,125] → 136,744 ops/sec [133,173..138,383] 🔴 -11.8%
Object.entries 48,149 ops/sec [47,358..49,044] → 56,753 ops/sec [56,130..58,081] 🟢 +17.9% 55,169 ops/sec [51,835..56,486] → 54,001 ops/sec [53,250..54,450] ~ overlap (-2.1%)
spread operator 87,744 ops/sec [85,081..88,597] → 103,148 ops/sec [101,671..107,076] 🟢 +17.6% 109,181 ops/sec [107,168..110,230] → 95,530 ops/sec [94,333..97,008] 🔴 -12.5%
promises.js — Interp: 🟢 10, 2 unch. · avg +5.5% · Bytecode: 🟢 1, 🔴 4, 7 unch. · avg -1.7%
Benchmark Interpreted Δ Bytecode Δ
Promise.resolve(value) 213,076 ops/sec [208,546..213,941] → 232,556 ops/sec [231,504..233,344] 🟢 +9.1% 269,257 ops/sec [267,218..270,241] → 253,983 ops/sec [250,635..255,577] 🔴 -5.7%
new Promise(resolve => resolve(value)) 82,189 ops/sec [81,407..83,008] → 89,048 ops/sec [88,640..91,453] 🟢 +8.3% 110,760 ops/sec [108,219..110,900] → 108,292 ops/sec [107,639..109,844] ~ overlap (-2.2%)
Promise.reject(reason) 220,216 ops/sec [218,757..223,093] → 235,462 ops/sec [234,061..238,449] 🟢 +6.9% 244,901 ops/sec [242,544..248,607] → 234,772 ops/sec [229,052..238,201] 🔴 -4.1%
resolve + then (1 handler) 80,858 ops/sec [79,236..82,321] → 82,995 ops/sec [82,353..84,804] 🟢 +2.6% 100,881 ops/sec [99,844..106,736] → 100,634 ops/sec [99,508..101,338] ~ overlap (-0.2%)
resolve + then chain (3 deep) 32,731 ops/sec [31,620..33,113] → 34,063 ops/sec [33,684..34,277] 🟢 +4.1% 42,337 ops/sec [41,789..43,004] → 41,862 ops/sec [41,211..42,327] ~ overlap (-1.1%)
resolve + then chain (10 deep) 10,814 ops/sec [10,577..11,034] → 11,255 ops/sec [10,970..11,355] ~ overlap (+4.1%) 13,977 ops/sec [13,786..14,145] → 13,686 ops/sec [13,561..13,820] ~ overlap (-2.1%)
reject + catch + then 47,346 ops/sec [45,751..48,445] → 48,107 ops/sec [47,192..48,360] ~ overlap (+1.6%) 57,432 ops/sec [55,874..58,419] → 54,342 ops/sec [53,566..54,722] 🔴 -5.4%
resolve + finally + then 40,322 ops/sec [39,229..41,141] → 42,544 ops/sec [41,759..42,599] 🟢 +5.5% 47,808 ops/sec [47,107..47,911] → 46,300 ops/sec [46,074..46,509] 🔴 -3.2%
Promise.all (5 resolved) 16,119 ops/sec [15,896..16,725] → 17,252 ops/sec [17,169..17,324] 🟢 +7.0% 16,292 ops/sec [16,111..16,582] → 16,300 ops/sec [16,229..16,623] ~ overlap (+0.0%)
Promise.race (5 resolved) 17,377 ops/sec [16,874..17,558] → 18,133 ops/sec [17,897..18,598] 🟢 +4.3% 17,349 ops/sec [17,205..17,601] → 17,352 ops/sec [17,118..17,493] ~ overlap (+0.0%)
Promise.allSettled (5 mixed) 14,304 ops/sec [14,280..14,429] → 15,058 ops/sec [14,611..15,498] 🟢 +5.3% 13,824 ops/sec [13,726..14,101] → 14,340 ops/sec [14,249..14,388] 🟢 +3.7%
Promise.any (5 mixed) 16,627 ops/sec [16,357..16,758] → 17,702 ops/sec [17,192..18,036] 🟢 +6.5% 16,357 ops/sec [16,082..16,548] → 16,301 ops/sec [16,020..16,434] ~ overlap (-0.3%)
regexp.js — Interp: 🟢 8, 3 unch. · avg +4.7% · Bytecode: 🔴 11 · avg -6.7%
Benchmark Interpreted Δ Bytecode Δ
regex literal creation 71,864 ops/sec [69,167..73,548] → 72,844 ops/sec [72,192..73,874] ~ overlap (+1.4%) 70,844 ops/sec [69,073..72,708] → 65,578 ops/sec [65,070..66,153] 🔴 -7.4%
new RegExp(pattern, flags) 63,052 ops/sec [61,597..64,715] → 63,998 ops/sec [63,740..64,567] ~ overlap (+1.5%) 69,765 ops/sec [68,605..70,191] → 65,300 ops/sec [62,976..66,182] 🔴 -6.4%
RegExp(existingRegex) returns the same regex 269,339 ops/sec [263,447..274,916] → 293,270 ops/sec [288,484..297,211] 🟢 +8.9% 452,506 ops/sec [442,616..463,588] → 429,068 ops/sec [392,349..440,004] 🔴 -5.2%
test() on a global regex 67,497 ops/sec [66,531..69,220] → 72,084 ops/sec [71,090..73,182] 🟢 +6.8% 84,123 ops/sec [82,861..85,030] → 78,758 ops/sec [75,467..80,707] 🔴 -6.4%
exec() with capture groups 57,621 ops/sec [56,040..58,595] → 61,659 ops/sec [61,051..62,448] 🟢 +7.0% 70,277 ops/sec [68,842..72,668] → 64,986 ops/sec [64,156..65,634] 🔴 -7.5%
toString() 201,085 ops/sec [197,031..202,381] → 210,399 ops/sec [207,598..216,170] 🟢 +4.6% 304,719 ops/sec [299,676..305,962] → 283,691 ops/sec [275,111..288,437] 🔴 -6.9%
match() with global regex 19,906 ops/sec [19,663..20,276] → 20,980 ops/sec [20,734..21,299] 🟢 +5.4% 20,873 ops/sec [20,579..21,606] → 19,131 ops/sec [18,906..19,861] 🔴 -8.3%
matchAll() with capture groups 10,496 ops/sec [10,190..10,653] → 10,854 ops/sec [10,742..10,958] 🟢 +3.4% 13,182 ops/sec [13,029..13,496] → 12,168 ops/sec [11,980..12,405] 🔴 -7.7%
replace() with global regex 19,823 ops/sec [19,064..20,296] → 20,734 ops/sec [20,338..20,940] 🟢 +4.6% 20,375 ops/sec [20,221..20,450] → 18,966 ops/sec [18,459..19,553] 🔴 -6.9%
search() with regex 39,902 ops/sec [39,004..40,901] → 41,318 ops/sec [40,585..41,977] ~ overlap (+3.5%) 40,646 ops/sec [39,833..42,703] → 37,991 ops/sec [37,407..38,675] 🔴 -6.5%
split() with regex separator 20,038 ops/sec [19,815..20,504] → 20,921 ops/sec [20,604..21,261] 🟢 +4.4% 21,035 ops/sec [20,652..21,254] → 20,058 ops/sec [19,849..20,115] 🔴 -4.6%
strings.js — Interp: 🟢 19 · avg +13.0% · Bytecode: 🔴 19 · avg -8.5%
Benchmark Interpreted Δ Bytecode Δ
string concatenation 149,629 ops/sec [146,267..151,524] → 178,154 ops/sec [174,462..182,341] 🟢 +19.1% 127,102 ops/sec [125,450..134,182] → 107,361 ops/sec [104,383..109,132] 🔴 -15.5%
template literal 296,015 ops/sec [287,262..301,776] → 336,153 ops/sec [331,459..357,895] 🟢 +13.6% 222,301 ops/sec [218,827..225,445] → 183,545 ops/sec [180,801..185,356] 🔴 -17.4%
string repeat 174,559 ops/sec [173,776..175,330] → 195,795 ops/sec [191,215..201,614] 🟢 +12.2% 226,745 ops/sec [223,808..228,832] → 201,786 ops/sec [199,058..203,802] 🔴 -11.0%
split and join 61,594 ops/sec [60,774..63,863] → 72,417 ops/sec [70,562..73,932] 🟢 +17.6% 75,977 ops/sec [74,124..76,860] → 65,847 ops/sec [64,664..67,474] 🔴 -13.3%
indexOf and includes 73,980 ops/sec [73,252..76,105] → 84,026 ops/sec [83,667..84,315] 🟢 +13.6% 88,495 ops/sec [87,620..90,699] → 81,693 ops/sec [80,605..82,148] 🔴 -7.7%
toUpperCase and toLowerCase 88,121 ops/sec [86,892..88,538] → 98,110 ops/sec [97,550..101,281] 🟢 +11.3% 116,331 ops/sec [114,576..118,638] → 110,275 ops/sec [106,907..111,434] 🔴 -5.2%
slice and substring 68,576 ops/sec [67,138..69,063] → 80,426 ops/sec [79,369..81,454] 🟢 +17.3% 94,256 ops/sec [91,961..96,646] → 86,462 ops/sec [83,465..88,109] 🔴 -8.3%
trim operations 80,459 ops/sec [79,107..81,095] → 89,597 ops/sec [87,965..91,115] 🟢 +11.4% 110,195 ops/sec [107,357..111,857] → 98,544 ops/sec [97,469..100,679] 🔴 -10.6%
replace and replaceAll 81,394 ops/sec [80,873..82,183] → 94,306 ops/sec [92,030..95,208] 🟢 +15.9% 95,247 ops/sec [94,072..95,984] → 87,394 ops/sec [84,833..90,132] 🔴 -8.2%
startsWith and endsWith 60,501 ops/sec [60,411..61,735] → 69,311 ops/sec [68,248..70,677] 🟢 +14.6% 72,646 ops/sec [70,568..75,156] → 69,253 ops/sec [67,809..69,677] 🔴 -4.7%
padStart and padEnd 89,034 ops/sec [87,886..89,835] → 100,665 ops/sec [97,786..102,320] 🟢 +13.1% 111,338 ops/sec [109,111..113,590] → 105,560 ops/sec [105,321..106,162] 🔴 -5.2%
identity tag, no substitutions 172,423 ops/sec [170,804..174,958] → 183,648 ops/sec [182,677..184,191] 🟢 +6.5% 643,760 ops/sec [625,125..675,639] → 562,520 ops/sec [561,524..563,682] 🔴 -12.6%
tag with 1 substitution 35,261 ops/sec [35,214..35,413] → 39,587 ops/sec [38,479..40,575] 🟢 +12.3% 55,126 ops/sec [53,098..55,780] → 50,042 ops/sec [49,268..51,781] 🔴 -9.2%
tag with 3 substitutions 18,630 ops/sec [18,506..18,755] → 21,210 ops/sec [20,954..21,565] 🟢 +13.8% 31,235 ops/sec [30,771..31,793] → 29,390 ops/sec [28,933..30,107] 🔴 -5.9%
tag with 6 substitutions 11,267 ops/sec [11,245..11,305] → 12,646 ops/sec [12,495..12,752] 🟢 +12.2% 17,536 ops/sec [17,303..18,021] → 16,835 ops/sec [16,727..17,191] 🔴 -4.0%
String.raw, no substitutions 237,741 ops/sec [236,443..238,124] → 254,133 ops/sec [252,597..257,308] 🟢 +6.9% 267,889 ops/sec [263,880..268,493] → 252,434 ops/sec [250,273..256,182] 🔴 -5.8%
String.raw, 2 substitutions 168,939 ops/sec [166,486..173,408] → 187,915 ops/sec [186,744..190,340] 🟢 +11.2% 188,514 ops/sec [187,926..193,573] → 179,577 ops/sec [169,161..181,414] 🔴 -4.7%
tag accessing .raw array 69,499 ops/sec [68,551..70,408] → 78,396 ops/sec [77,867..78,965] 🟢 +12.8% 100,377 ops/sec [98,489..103,383] → 93,448 ops/sec [92,251..93,591] 🔴 -6.9%
method as tag (this binding) 26,293 ops/sec [26,190..26,547] → 29,534 ops/sec [29,455..29,572] 🟢 +12.3% 42,844 ops/sec [42,424..43,239] → 40,993 ops/sec [40,183..41,543] 🔴 -4.3%
tsv.js — Interp: 🟢 9 · avg +11.3% · Bytecode: 🔴 8, 1 unch. · avg -8.3%
Benchmark Interpreted Δ Bytecode Δ
parse simple 3-column TSV 46,486 ops/sec [45,541..46,950] → 52,992 ops/sec [52,660..53,233] 🟢 +14.0% 51,535 ops/sec [51,019..51,654] → 48,660 ops/sec [48,580..49,697] 🔴 -5.6%
parse 10-row TSV 12,824 ops/sec [12,479..13,302] → 14,481 ops/sec [14,003..15,218] 🟢 +12.9% 13,721 ops/sec [13,524..13,802] → 12,916 ops/sec [12,813..13,093] 🔴 -5.9%
parse 100-row TSV 2,040 ops/sec [1,918..2,126] → 2,277 ops/sec [2,268..2,292] 🟢 +11.6% 2,127 ops/sec [2,098..2,174] → 2,050 ops/sec [1,737..2,073] 🔴 -3.6%
parse TSV with backslash-escaped fields 9,435 ops/sec [9,189..9,643] → 10,008 ops/sec [9,951..10,313] 🟢 +6.1% 9,936 ops/sec [9,823..10,580] → 9,831 ops/sec [9,708..9,975] ~ overlap (-1.1%)
parse without headers (array of arrays) 5,745 ops/sec [5,472..5,954] → 6,145 ops/sec [6,117..6,218] 🟢 +7.0% 5,929 ops/sec [5,872..6,186] → 5,779 ops/sec [5,732..5,866] 🔴 -2.5%
stringify array of objects 40,173 ops/sec [39,728..42,533] → 45,440 ops/sec [44,687..45,649] 🟢 +13.1% 48,002 ops/sec [47,499..48,700] → 40,195 ops/sec [39,521..40,810] 🔴 -16.3%
stringify array of arrays 11,671 ops/sec [11,301..11,848] → 13,094 ops/sec [12,719..13,195] 🟢 +12.2% 13,181 ops/sec [13,021..13,278] → 10,750 ops/sec [10,254..10,877] 🔴 -18.4%
stringify with values needing escaping 30,989 ops/sec [30,352..32,638] → 34,827 ops/sec [34,360..35,092] 🟢 +12.4% 35,525 ops/sec [35,199..35,874] → 31,398 ops/sec [31,110..31,470] 🔴 -11.6%
parse then stringify 7,075 ops/sec [7,034..7,161] → 7,958 ops/sec [7,763..8,169] 🟢 +12.5% 7,940 ops/sec [7,810..8,003] → 7,170 ops/sec [7,123..7,241] 🔴 -9.7%
typed-arrays.js — Interp: 🟢 17, 🔴 2, 3 unch. · avg +16.4% · Bytecode: 🟢 7, 🔴 8, 7 unch. · avg -9.6%
Benchmark Interpreted Δ Bytecode Δ
new Int32Array(0) 138,804 ops/sec [133,132..140,986] → 151,382 ops/sec [150,480..156,314] 🟢 +9.1% 170,407 ops/sec [167,874..170,742] → 172,463 ops/sec [171,231..172,740] 🟢 +1.2%
new Int32Array(100) 128,045 ops/sec [125,617..131,915] → 142,159 ops/sec [140,126..146,824] 🟢 +11.0% 157,508 ops/sec [153,372..161,620] → 162,522 ops/sec [161,700..163,569] 🟢 +3.2%
new Int32Array(1000) 93,401 ops/sec [92,646..94,401] → 94,871 ops/sec [93,333..96,661] ~ overlap (+1.6%) 104,892 ops/sec [102,248..106,078] → 118,097 ops/sec [115,606..118,659] 🟢 +12.6%
new Float64Array(100) 122,532 ops/sec [121,182..123,865] → 131,967 ops/sec [128,444..132,776] 🟢 +7.7% 145,973 ops/sec [143,860..150,173] → 150,917 ops/sec [148,641..153,441] ~ overlap (+3.4%)
Int32Array.from([...]) 89,570 ops/sec [89,081..90,114] → 94,872 ops/sec [94,157..95,410] 🟢 +5.9% 104,012 ops/sec [101,607..105,149] → 101,468 ops/sec [100,759..102,225] ~ overlap (-2.4%)
Int32Array.of(1, 2, 3, 4, 5) 137,142 ops/sec [135,951..139,555] → 148,875 ops/sec [146,186..150,323] 🟢 +8.6% 167,936 ops/sec [167,338..173,483] → 169,335 ops/sec [166,809..174,145] ~ overlap (+0.8%)
sequential write 100 elements 1,644 ops/sec [1,616..1,657] → 1,781 ops/sec [1,734..1,822] 🟢 +8.4% 6,075 ops/sec [6,028..6,152] → 5,878 ops/sec [5,812..6,064] ~ overlap (-3.2%)
sequential read 100 elements 1,715 ops/sec [1,655..1,728] → 2,912 ops/sec [2,858..2,917] 🟢 +69.8% 5,919 ops/sec [5,856..5,939] → 5,784 ops/sec [5,501..5,808] 🔴 -2.3%
Float64Array write 100 elements 1,573 ops/sec [1,537..1,584] → 2,619 ops/sec [2,610..2,622] 🟢 +66.5% 4,207 ops/sec [4,135..4,233] → 4,165 ops/sec [4,126..4,215] ~ overlap (-1.0%)
fill(42) 26,593 ops/sec [26,135..26,980] → 41,882 ops/sec [41,336..42,538] 🟢 +57.5% 29,146 ops/sec [28,781..29,301] → 27,448 ops/sec [27,103..27,894] 🔴 -5.8%
slice() 114,536 ops/sec [112,912..116,231] → 163,812 ops/sec [163,258..164,319] 🟢 +43.0% 137,982 ops/sec [136,802..138,318] → 126,622 ops/sec [126,513..127,203] 🔴 -8.2%
map(x => x * 2) 2,843 ops/sec [2,811..2,849] → 5,186 ops/sec [5,116..5,267] 🟢 +82.4% 4,568 ops/sec [4,548..7,710] → 4,200 ops/sec [4,104..4,228] 🔴 -8.1%
filter(x => x > 50) 3,034 ops/sec [2,973..3,065] → 3,395 ops/sec [3,364..3,413] 🟢 +11.9% 8,514 ops/sec [8,493..8,533] → 4,557 ops/sec [4,543..4,562] 🔴 -46.5%
reduce (sum) 2,906 ops/sec [2,857..2,940] → 3,221 ops/sec [3,184..3,324] 🟢 +10.9% 7,035 ops/sec [6,905..7,072] → 3,865 ops/sec [3,803..3,963] 🔴 -45.1%
sort() 106,824 ops/sec [106,394..108,063] → 109,391 ops/sec [107,980..110,914] ~ overlap (+2.4%) 158,445 ops/sec [157,378..159,117] → 199,585 ops/sec [199,442..199,907] 🟢 +26.0%
indexOf() 204,841 ops/sec [203,242..206,203] → 219,558 ops/sec [218,528..219,850] 🟢 +7.2% 416,441 ops/sec [412,329..419,261] → 255,898 ops/sec [248,925..426,230] ~ overlap (-38.6%)
reverse() 168,205 ops/sec [167,130..169,161] → 173,695 ops/sec [171,218..181,817] 🟢 +3.3% 316,955 ops/sec [315,259..317,800] → 188,096 ops/sec [187,097..189,874] 🔴 -40.7%
create view over existing buffer 161,681 ops/sec [160,216..164,557] → 174,419 ops/sec [173,066..176,474] 🟢 +7.9% 328,654 ops/sec [327,815..332,901] → 198,813 ops/sec [197,596..200,655] 🔴 -39.5%
subarray() 187,548 ops/sec [184,082..187,882] → 205,250 ops/sec [202,801..207,494] 🟢 +9.4% 416,143 ops/sec [415,035..416,965] → 252,907 ops/sec [249,685..447,137] ~ overlap (-39.2%)
set() from array 365,899 ops/sec [364,822..367,681] → 245,521 ops/sec [244,503..246,102] 🔴 -32.9% 522,200 ops/sec [521,063..524,756] → 541,670 ops/sec [540,807..544,177] 🟢 +3.7%
for-of loop 3,990 ops/sec [3,941..4,063] → 2,764 ops/sec [2,709..2,882] 🔴 -30.7% 13,940 ops/sec [13,745..13,947] → 14,841 ops/sec [14,670..14,927] 🟢 +6.5%
spread into array 14,881 ops/sec [14,628..15,074] → 14,847 ops/sec [14,789..15,077] ~ overlap (-0.2%) 58,884 ops/sec [58,641..59,570] → 66,201 ops/sec [65,928..66,493] 🟢 +12.4%
uint8array-encoding.js — Interp: 🟢 13, 5 unch. · avg +4.2% · Bytecode: 🟢 3, 🔴 10, 5 unch. · avg -0.9%
Benchmark Interpreted Δ Bytecode Δ
short (5 bytes) 285,287 ops/sec [282,629..288,100] → 305,122 ops/sec [299,840..307,355] 🟢 +7.0% 507,969 ops/sec [503,625..509,813] → 491,891 ops/sec [485,994..498,198] 🔴 -3.2%
medium (450 bytes) 156,245 ops/sec [155,399..157,145] → 163,902 ops/sec [161,243..165,521] 🟢 +4.9% 213,179 ops/sec [211,220..214,980] → 198,905 ops/sec [196,509..201,812] 🔴 -6.7%
large (4096 bytes) 32,767 ops/sec [31,919..33,058] → 33,793 ops/sec [33,267..33,966] 🟢 +3.1% 35,351 ops/sec [35,230..36,791] → 34,364 ops/sec [33,576..34,549] 🔴 -2.8%
base64url alphabet 108,658 ops/sec [105,670..111,187] → 114,757 ops/sec [112,997..116,651] 🟢 +5.6% 128,760 ops/sec [128,095..129,582] → 117,654 ops/sec [116,611..121,536] 🔴 -8.6%
omitPadding 168,005 ops/sec [164,702..169,544] → 177,331 ops/sec [175,547..179,225] 🟢 +5.6% 222,329 ops/sec [219,145..227,884] → 210,178 ops/sec [206,743..225,730] ~ overlap (-5.5%)
short (8 chars) 146,353 ops/sec [143,325..150,383] → 156,681 ops/sec [154,943..157,211] 🟢 +7.1% 185,216 ops/sec [180,067..186,676] → 179,435 ops/sec [174,213..182,562] ~ overlap (-3.1%)
medium (600 chars) 71,236 ops/sec [70,398..72,693] → 73,312 ops/sec [72,762..74,163] 🟢 +2.9% 79,252 ops/sec [78,478..80,951] → 76,511 ops/sec [75,682..78,382] 🔴 -3.5%
large (5464 chars) 13,868 ops/sec [13,658..13,896] → 13,912 ops/sec [13,635..14,063] ~ overlap (+0.3%) 24,277 ops/sec [24,213..24,349] → 13,853 ops/sec [13,656..13,946] 🔴 -42.9%
short (5 bytes) 308,275 ops/sec [287,878..312,158] → 314,786 ops/sec [312,386..317,442] 🟢 +2.1% 532,848 ops/sec [532,652..581,253] → 499,883 ops/sec [497,540..502,953] 🔴 -6.2%
medium (450 bytes) 126,191 ops/sec [123,598..128,693] → 145,841 ops/sec [144,834..147,037] 🟢 +15.6% 168,477 ops/sec [167,429..170,957] → 168,327 ops/sec [166,247..169,779] ~ overlap (-0.1%)
large (4096 bytes) 22,611 ops/sec [22,096..22,982] → 26,514 ops/sec [25,689..27,136] 🟢 +17.3% 25,148 ops/sec [25,031..25,890] → 26,891 ops/sec [26,536..27,041] 🟢 +6.9%
short (10 chars) 166,651 ops/sec [165,374..168,156] → 172,571 ops/sec [171,068..175,057] 🟢 +3.6% 199,404 ops/sec [195,536..201,234] → 337,339 ops/sec [335,752..338,344] 🟢 +69.2%
medium (900 chars) 107,226 ops/sec [105,064..109,270] → 107,163 ops/sec [105,747..108,267] ~ overlap (-0.1%) 122,592 ops/sec [122,005..123,878] → 125,781 ops/sec [123,474..216,457] ~ overlap (+2.6%)
large (8192 chars) 27,341 ops/sec [26,882..27,998] → 26,130 ops/sec [25,813..27,195] ~ overlap (-4.4%) 29,657 ops/sec [28,329..29,980] → 31,727 ops/sec [31,319..32,025] 🟢 +7.0%
setFromBase64 (450 bytes) 72,416 ops/sec [71,885..72,742] → 71,744 ops/sec [71,074..72,175] ~ overlap (-0.9%) 84,195 ops/sec [82,215..84,694] → 80,522 ops/sec [79,396..81,315] 🔴 -4.4%
setFromHex (450 bytes) 105,889 ops/sec [105,205..106,471] → 103,933 ops/sec [101,917..106,489] ~ overlap (-1.8%) 125,656 ops/sec [124,976..127,927] → 119,964 ops/sec [119,337..120,083] 🔴 -4.5%
toBase64 → fromBase64 (450 bytes) 55,176 ops/sec [54,882..55,373] → 56,309 ops/sec [55,986..56,669] 🟢 +2.1% 61,657 ops/sec [61,455..61,826] → 56,969 ops/sec [56,783..57,106] 🔴 -7.6%
toHex → fromHex (450 bytes) 66,386 ops/sec [65,537..67,213] → 70,658 ops/sec [69,707..71,817] 🟢 +6.4% 74,965 ops/sec [74,074..75,633] → 72,899 ops/sec [72,678..74,291] ~ overlap (-2.8%)
weak-collections.js — Interp: 🟢 12, 🔴 1, 2 unch. · avg +25.5% · Bytecode: 🟢 3, 🔴 9, 3 unch. · avg +2.5%
Benchmark Interpreted Δ Bytecode Δ
constructor from 50 entries 12,682 ops/sec [12,317..13,093] → 14,551 ops/sec [14,491..14,654] 🟢 +14.7% 14,457 ops/sec [14,073..14,623] → 12,381 ops/sec [12,153..12,559] 🔴 -14.4%
set 50 object keys 4,682 ops/sec [4,576..4,754] → 5,282 ops/sec [5,230..5,316] 🟢 +12.8% 7,184 ops/sec [7,138..7,279] → 6,763 ops/sec [6,715..6,793] 🔴 -5.9%
get lookups (50 entries) 60,165 ops/sec [59,065..61,014] → 65,744 ops/sec [65,252..66,690] 🟢 +9.3% 106,644 ops/sec [104,746..113,390] → 98,522 ops/sec [94,929..98,958] 🔴 -7.6%
has checks (50 entries) 79,403 ops/sec [78,604..79,829] → 87,738 ops/sec [77,393..137,731] ~ overlap (+10.5%) 137,283 ops/sec [135,813..140,433] → 117,277 ops/sec [114,688..117,935] 🔴 -14.6%
delete entries 4,296 ops/sec [4,193..4,414] → 7,615 ops/sec [7,578..7,643] 🟢 +77.2% 6,768 ops/sec [6,609..6,887] → 5,983 ops/sec [5,861..6,044] 🔴 -11.6%
non-registered symbol keys 10,443 ops/sec [10,340..10,627] → 18,278 ops/sec [18,077..18,486] 🟢 +75.0% 15,928 ops/sec [15,619..16,376] → 14,625 ops/sec [14,383..15,012] 🔴 -8.2%
getOrInsert 4,268 ops/sec [4,212..4,298] → 7,460 ops/sec [7,278..7,614] 🟢 +74.8% 6,787 ops/sec [6,659..6,994] → 6,216 ops/sec [6,100..6,361] 🔴 -8.4%
getOrInsertComputed 2,177 ops/sec [2,113..3,312] → 3,572 ops/sec [3,540..3,604] 🟢 +64.1% 3,150 ops/sec [3,068..3,269] → 2,989 ops/sec [2,933..5,046] ~ overlap (-5.1%)
forced gc live-key retention 6,927 ops/sec [6,852..6,973] → 7,455 ops/sec [7,356..7,535] 🟢 +7.6% 5,878 ops/sec [5,801..5,909] → 9,182 ops/sec [9,100..9,221] 🟢 +56.2%
constructor from 50 values 28,616 ops/sec [28,532..28,679] → 28,020 ops/sec [27,547..28,667] ~ overlap (-2.1%) 19,401 ops/sec [18,573..19,614] → 31,112 ops/sec [30,897..31,500] 🟢 +60.4%
add 50 object values 8,013 ops/sec [7,984..8,025] → 8,926 ops/sec [8,843..9,047] 🟢 +11.4% 12,738 ops/sec [12,670..12,803] → 12,727 ops/sec [12,684..12,746] ~ overlap (-0.1%)
has checks (50 values) 125,308 ops/sec [124,564..125,662] → 137,447 ops/sec [136,656..138,477] 🟢 +9.7% 234,420 ops/sec [232,583..235,354] → 223,055 ops/sec [221,995..224,620] 🔴 -4.8%
delete values 22,055 ops/sec [21,955..22,156] → 21,878 ops/sec [21,596..21,939] 🔴 -0.8% 26,141 ops/sec [25,172..26,448] → 27,664 ops/sec [26,970..27,993] 🟢 +5.8%
non-registered symbol values 17,586 ops/sec [17,304..17,860] → 19,748 ops/sec [19,315..20,166] 🟢 +12.3% 28,617 ops/sec [28,453..29,159] → 28,623 ops/sec [28,419..28,889] ~ overlap (+0.0%)
forced gc pruning smoke 8,596 ops/sec [8,465..8,609] → 9,157 ops/sec [9,146..9,165] 🟢 +6.5% 12,230 ops/sec [12,176..12,316] → 11,785 ops/sec [11,676..11,810] 🔴 -3.6%

Measured on ubuntu-latest x64. Benchmark ranges compare cached main-branch min/max ops/sec with the PR run; overlapping ranges are treated as unchanged noise. Percentage deltas are secondary context.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 29, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 8243 8243
Tests Passed 8202 ✅ 8243 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 1.40s 1.91s
Tests Lex (cumulative) 157.5ms 133.3ms
Tests Parse (cumulative) 235.6ms 328.5ms
Tests Compile (cumulative) 208.8ms
Tests Execute (cumulative) 1.13s 1.60s
Tests Engine Total (cumulative) 1.52s 2.28s
Tests Lex (avg/worker) 39.4ms 33.3ms
Tests Parse (avg/worker) 58.9ms 82.1ms
Tests Compile (avg/worker) 52.2ms
Tests Execute (avg/worker) 281.4ms 401.2ms
Tests Engine Total (avg/worker) 379.7ms 568.8ms
Benchmarks Total 407 407
Benchmarks Workers 4 4
Benchmarks Duration 2.54min 2.36min

Measured on ubuntu-latest x64.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
website/src/app/.well-known/api-catalog/route.ts (1)

6-12: Prefer an absolute URI for rel="self" in the Link header

Using an absolute URI here improves consistency with anchor and removes client-side ambiguity around relative resolution.

Proposed update
 export function GET(req: Request) {
   const origin = new URL(req.url).origin;
+  const self = new URL(API_CATALOG_PATH, origin).toString();
   return new Response(JSON.stringify(buildApiCatalog(origin), null, 2), {
     headers: {
       "Content-Type":
         'application/linkset+json; profile="https://www.rfc-editor.org/info/rfc9727"; charset=utf-8',
-      Link: `<${API_CATALOG_PATH}>; rel="self"; type="application/linkset+json"`,
+      Link: `<${self}>; rel="self"; type="application/linkset+json"`,
     },
   });
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@website/src/app/.well-known/api-catalog/route.ts` around lines 6 - 12, The
Link header currently uses the relative API_CATALOG_PATH which can cause
ambiguous resolution; change it to an absolute URI by resolving API_CATALOG_PATH
against the request origin (use the same origin you pass to buildApiCatalog from
req.url) and put that absolute URL in the Link header (e.g. via new
URL(API_CATALOG_PATH, origin) or equivalent) while keeping the rest of the
header values identical; update the Link value creation near where origin,
buildApiCatalog, and API_CATALOG_PATH are referenced.
website/src/__tests__/agent-discovery.test.ts (1)

49-51: Reduce order-coupling in endpoint assertion

This assertion is slightly brittle because it depends on array ordering. Prefer containment-based matching so reordering doesn’t break intent.

Proposed update
-    expect(body.linkset[0].item[0].href).toBe(
-      "https://example.test/api/execute",
-    );
+    expect(body.linkset[0].item).toContainEqual({
+      href: "https://example.test/api/execute",
+      type: "application/json",
+    });
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@website/src/__tests__/agent-discovery.test.ts` around lines 49 - 51, The
assertion currently depends on indexing into body.linkset[0].item[0].href which
is order-sensitive; change it to a containment-based check that scans the item
array for the expected href (e.g., map item entries to their hrefs and assert
the resulting array contains "https://example.test/api/execute" or use
Array.prototype.some to assert any item.href matches) so the test passes even if
items are reordered; update the assertion referencing body.linkset[0].item (in
agent-discovery.test.ts) accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@website/src/__tests__/agent-discovery.test.ts`:
- Around line 49-51: The assertion currently depends on indexing into
body.linkset[0].item[0].href which is order-sensitive; change it to a
containment-based check that scans the item array for the expected href (e.g.,
map item entries to their hrefs and assert the resulting array contains
"https://example.test/api/execute" or use Array.prototype.some to assert any
item.href matches) so the test passes even if items are reordered; update the
assertion referencing body.linkset[0].item (in agent-discovery.test.ts)
accordingly.

In `@website/src/app/.well-known/api-catalog/route.ts`:
- Around line 6-12: The Link header currently uses the relative API_CATALOG_PATH
which can cause ambiguous resolution; change it to an absolute URI by resolving
API_CATALOG_PATH against the request origin (use the same origin you pass to
buildApiCatalog from req.url) and put that absolute URL in the Link header (e.g.
via new URL(API_CATALOG_PATH, origin) or equivalent) while keeping the rest of
the header values identical; update the Link value creation near where origin,
buildApiCatalog, and API_CATALOG_PATH are referenced.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 917d7f5b-4925-4083-bc64-86a04253acb6

📥 Commits

Reviewing files that changed from the base of the PR and between 2c96f54 and 88ac3e9.

📒 Files selected for processing (4)
  • website/next.config.ts
  • website/src/__tests__/agent-discovery.test.ts
  • website/src/app/.well-known/api-catalog/route.ts
  • website/src/lib/agent-discovery.ts

@frostney frostney merged commit fc1fa59 into main Apr 29, 2026
12 checks passed
@frostney frostney deleted the t3code/agent-link-headers branch April 29, 2026 12:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant