Skip to content

refactor(website): adopt Fumadocs and Astryx#992

Merged
frostney merged 4 commits into
mainfrom
codex/website-fumadocs-astryx
Jul 21, 2026
Merged

refactor(website): adopt Fumadocs and Astryx#992
frostney merged 4 commits into
mainfrom
codex/website-fumadocs-astryx

Conversation

@frostney

@frostney frostney commented Jul 20, 2026

Copy link
Copy Markdown
Owner

Summary

  • Read README.md and docs/**/*.md directly through Fumadocs, removing the sync script, copied-content pipeline, registry, and custom Markdown renderer.
  • Replace shared navigation, docs navigation, tabs, code blocks, buttons, checkboxes, range selectors, and command selection with Astryx while mapping its semantic tokens onto the existing warm-paper and espresso identity.
  • Replace the landing-page feature cards, compiler samples, and FAQ with Astryx components; the FAQ is now one full-width horizontal accordion, and the bespoke numbered-code component and most related CSS are gone.
  • Run the Next.js website explicitly under Bun for development, production builds, and production serving.
  • Scope project-owned section styles so they do not collide with Astryx variant classes, and use Astryx's segmented control for OS and package-manager selection.
  • Make the standard 1200 by 630 X/Open Graph card more compression-resistant with fewer, larger, heavier lines.
  • Preserve the domain-specific editor, resizers, charts, sandbox behavior, machine-readable routes, and established documentation URLs.

Visual evidence

Surface Before After
Homepage, desktop Before homepage desktop After homepage desktop
Docs, desktop Before docs desktop After docs desktop
Homepage, mobile Before homepage mobile After homepage mobile
Docs, mobile Before docs mobile After docs mobile

Additional checks: espresso docs theme, mobile docs navigation, and revised social card.

Testing

  • Verified no regressions and confirmed the new feature or bugfix in end-to-end JavaScript/TypeScript tests
  • Updated documentation
  • Optional: Verified no regressions and confirmed the new feature or bugfix in native Pascal tests (if AST, scope, evaluator, or value types changed)
  • Optional: Verified no benchmark regressions or confirmed benchmark coverage for the change

Validation performed:

  • cd website && bun run lint
  • cd website && bunx tsc --noEmit
  • cd website && bun run test — 158 passed
  • cd website && bun run build — 156 pages generated under Bun
  • Browser QA across all eight HTML routes at desktop and mobile sizes, including automatic light/dark themes, keyboard-operated OS selection and mobile navigation, machine-readable routes, console errors, and horizontal overflow
  • Browser QA of the full-width Astryx FAQ at desktop and mobile sizes, including multiple open answers and dark mode
  • ./build.pas testrunner && ./build/GocciaTestRunner tests && ./build/GocciaTestRunner tests --mode=bytecode — 11,517 tests and 25,735 assertions passed in each mode
  • ./format.pas --check — 428 files formatted
  • Benchmark suite not run because the change is isolated to the website

frostney added 2 commits July 21, 2026 00:49
Read repository Markdown directly through Fumadocs, replace shared handrolled UI with Astryx primitives, and make the social card more compression-resistant while preserving the existing visual identity.
@vercel

vercel Bot commented Jul 20, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
gocciascript-homepage Ready Ready Preview, Comment Jul 21, 2026 12:53am

Request Review

@coderabbitai

coderabbitai Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

The website now consumes repository Markdown through Fumadocs, adds a generated MDX documentation route, adopts Astryx shared UI components and shell styling, and updates sitemap, runtime configuration, discovery headers, and related tests.

Changes

Website documentation migration

Layer / File(s) Summary
Repository-backed documentation foundation
website/source.config.ts, website/src/lib/docs-source.ts, website/src/lib/site-markdown.ts, website/src/app/sitemap.ts, website/package.json, website/next.config.*
Fumadocs reads README.md and docs/**/*.md directly, generates repository-backed pages and metadata, and replaces synchronized documentation scripts and filesystem sitemap lookups.
Generated docs route and MDX rendering
website/src/app/docs/[[...slug]]/page.tsx, website/src/components/docs-mdx.tsx, website/src/components/docs-nav.tsx, website/src/app/globals.css
A catch-all docs route generates static parameters and metadata, renders MDX content, resolves repository links, and displays grouped navigation and outlines.
Astryx shell and landing-page styling
website/src/components/site-shell.tsx, website/src/components/landing.tsx, website/src/app/globals.css, website/src/app/opengraph-image.tsx
The site shell, landing sections, global tokens, navigation, code displays, FAQ controls, and Open Graph image use updated Astryx-based styling and components.
Shared controls across interactive surfaces
website/src/components/command-tabs.tsx, website/src/components/playground.tsx, website/src/components/sandbox.tsx, website/src/components/performance-dashboard.tsx, website/src/components/test262-dashboard.tsx
Native buttons, checkboxes, tab groups, and custom code displays are replaced with shared Astryx controls while preserving existing state and handlers.
Runtime and discovery support
website/src/lib/agent-discovery*.ts, website/src/lib/goccia-api.ts, website/src/lib/vendor-manifest-server.ts, website/src/__tests__/*
Agent discovery header construction is separated into an ESM module, Turbopack path hints are added, vendor manifest cache reset support is exposed for tests, and configuration/sitemap tests follow the new modules.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Browser
  participant DocsPage
  participant docsSource
  participant docsMdxComponents
  Browser->>DocsPage: request documentation route
  DocsPage->>docsSource: resolve page and navigation
  DocsPage->>docsMdxComponents: render MDX content
  docsMdxComponents-->>Browser: return documentation UI
Loading

Possibly related PRs

Suggested labels: internal, documentation

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 12.50% 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 accurately summarizes the main change: adopting Fumadocs and Astryx across the website.
Description check ✅ Passed The description matches the required template with Summary and Testing sections, plus detailed validation evidence.
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.

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

@github-actions

github-actions Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Web Tooling Benchmark

Workload Status Goccia
acorn pass 0.03 runs/s
babel pass 0.01 runs/s
babel-minify pass 0.10 runs/s
babylon pass 0.05 runs/s
buble pass 0.09 runs/s
chai pass 0.13 runs/s
coffeescript pass 0.01 runs/s
espree pass 0.02 runs/s
esprima pass 0.06 runs/s
jshint pass 0.01 runs/s
lebab pass 0.07 runs/s
postcss pass 0.02 runs/s
prepack pass 0.10 runs/s
prettier pass 0.07 runs/s
source-map pass 0.03 runs/s
terser pass 215 runs/s
typescript pass 0.15 runs/s
uglify-js pass 115 runs/s

18 pinned Web Tooling workloads; 18 workloads produced at least one Goccia sample. Raw results from 1 sample per workload; full stdout/stderr for failures and min/max/CV stay in the web-tooling-report artifact. This lane is Goccia-only by design.

@github-actions

github-actions Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Suite Timing

Test Runner (interpreted: 11,517 passed; bytecode: 11,517 passed)
Metric Interpreted Bytecode
Total 11517 11517
Passed 11517 ✅ 11517 ✅
Workers 4 4
Test Duration 17.44s 18.74s
Lex (cumulative) 1.89s 1.85s
Parse (cumulative) 935.9ms 1.01s
Compile (cumulative) 1.15s
Execute (cumulative) 291.8ms 19.31s
Engine Total (cumulative) 3.12s 23.32s
Lex (avg/worker) 472.6ms 462.1ms
Parse (avg/worker) 234.0ms 252.9ms
Compile (avg/worker) 287.2ms
Execute (avg/worker) 73.0ms 4.83s
Engine Total (avg/worker) 779.5ms 5.83s

Memory

GC rows aggregate the main thread plus all worker thread-local GCs. Test runner worker shutdown frees thread-local heaps in bulk; that shutdown reclamation is not counted as GC collections or collected objects.

Metric Interpreted Bytecode
GC Live 63.94 MiB 64.15 MiB
GC Peak Live 208.90 MiB 177.08 MiB
GC Allocated During Run 521.35 MiB 454.36 MiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 226 226
GC Collected Objects 4,397,283 3,827,912
Heap Start Allocated 326.3 KiB 326.3 KiB
Heap End Allocated 2.89 MiB 2.90 MiB
Heap Delta Allocated 2.58 MiB 2.58 MiB
Heap Delta Free 2.24 MiB 2.23 MiB
Benchmarks (interpreted: 439; bytecode: 439)
Metric Interpreted Bytecode
Total 439 439
Workers 4 4
Duration 3.02min 3.05min

Memory

GC rows aggregate the main thread plus all worker thread-local GCs. Benchmark runner performs explicit between-file collections, so collection and collected-object counts can be much higher than the test runner.

Metric Interpreted Bytecode
GC Live 808 B 808 B
GC Peak Live 158.38 MiB 96.10 MiB
GC Allocated During Run 19.54 GiB 13.45 GiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 9,193 6,718
GC Collected Objects 283,637,720 296,826,922
Heap Start Allocated 1.36 MiB 1.36 MiB
Heap End Allocated 1.37 MiB 1.37 MiB
Heap Delta Allocated 3.2 KiB 3.2 KiB
Boot
Metric Interpreted Bytecode
Boot (median) 7.1ms 7.3ms
Boot (min) 7.0ms 7.2ms

Empty-script (0;) end-to-end process wall-clock for GocciaScriptLoader, min and median over 60 runs after 10 warmups. Includes a fixed process / dynamic-loader floor that does not shrink, so it understates the engine-boot speedup; treat as practical boot time, not pure engine work.

Measured on ubuntu-latest x64.

@github-actions

github-actions Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results

439 benchmarks · PR vs same-runner main build

Interpreted: 🟢 66 improved · 🔴 55 regressed · 318 unchanged · avg +0.7%
Bytecode: 🟢 38 improved · 🔴 23 regressed · 378 unchanged · avg +0.8%

Typical per-run noise (median variance): interpreted ±1.7%, bytecode ±2.3%. Deltas within noise overlap and read as unchanged.

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

Deterministic profile diff

Deterministic profile diff: no significant changes.

Measured on ubuntu-latest x64. Each PR run also builds the main base and benchmarks it back-to-back on the same runner after a warm-up discard, so the ranges compare two runs measured under the same conditions; overlapping min/max ranges are treated as unchanged noise. Percentage deltas are secondary context. See docs/adr/0076.

@github-actions

github-actions Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

JetStream 3 Performance Barometer

Workload Status Goccia main Goccia PR QuickJS Node.js vs QuickJS vs Node.js
hash-map pass 0.58 0.58 13.21 324.05 22.75× 558.07×
ai-astar pass 1.73 1.73 41.76 342.32 24.11× 197.63×
gaussian-blur pass 0.34 0.34 7.92 298.59 23.30× 878.24×
raytrace-public-class-fields pass 0.44 0.44 11.55 200.82 26.42× 459.48×
sync-fs pass 0.87 0.92 27.42 234.45 29.76× 254.48×
lazy-collections pass 1.96 1.96 68.18 151.91 34.77× 77.46×

Geomean reference ratio: QuickJS 26.54×; Node.js 309.41×.

1.00× means aligned; values above 1.00× mean Goccia was proportionally slower after normalizing JetStream’s higher-is-better score. This is a directional barometer across runtimes with different goals, not a product ranking. Raw samples and failure details remain in the jetstream-report artifact.

@github-actions

github-actions Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

test262 Conformance

11 timeout(s) — counted separately from ordinary conformance failures; inspect the full artifact for affected tests.

Category Run Passed Δ Pass Failed Timeouts Δ Timeout Wrap-Infra Pass-rate Δ Rate
built-ins 23,668 23,668 +2 0 0 -2 0 100.0% ±0pp
harness 116 116 ±0 0 0 ±0 0 100.0% ±0pp
intl402 3,349 3,340 ±0 8 1 ±0 0 99.7% ±0pp
language 23,713 23,712 +2 1 0 -2 0 100.0% ±0pp
staging 1,482 1,386 +2 86 10 -2 0 93.5% +0.1pp
total 52,328 52,222 +6 95 11 -6 0 99.8% ±0pp

Areas closest to 100%

Area Pass rate Δ vs main Passing
language/expressions 100.0% ±0pp 11,101 / 11,102
intl402/Temporal 100.0% ±0pp 2,028 / 2,029
intl402/NumberFormat 99.6% ±0pp 248 / 249
Per-test deltas (+0 / -0 / timeout +0 / -6)

Resolved timeouts (6):

  • built-ins/decodeURI/S15.1.3.1_A2.5_T1.js
  • built-ins/decodeURIComponent/S15.1.3.2_A2.5_T1.js
  • language/identifiers/start-unicode-10.0.0-class-escaped.js
  • language/identifiers/start-unicode-10.0.0-class.js
  • staging/sm/extensions/recursion.js
  • staging/sm/TypedArray/element-setting-converts-using-ToNumber.js

Steady-state failures and timeouts are non-blocking; PASS → non-timeout failure transitions fail the conformance gate. Measured on ubuntu-latest x64, bytecode mode. Areas grouped by the first two test262 path components; minimum 25 attempted tests, areas already at 100% excluded. Δ vs main compares against the most recent cached main baseline.

@github-actions

github-actions Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

AWFY Results

Target Status Goccia main Goccia PR QuickJS 2026-06-04 NodeJS v26.5.0 Δ PR vs main
Bounce pass 24.04ms 24.52ms 1.05ms 1.06ms ~ overlap (-2.00%)
CD pass 222.25ms 223.17ms 10.72ms 9.02ms ~ overlap (-0.42%)
DeltaBlue pass 5.16ms 5.15ms 304.54µs 1.81ms ~ overlap (+0.12%)
Havlak pass 86.23s 86.70s 3994.61ms 175.35ms ~ overlap (-0.53%)
Json pass 375.71ms 376.74ms 14.39ms 4.79ms ~ overlap (-0.27%)
List pass 17.18ms 16.96ms 1.02ms 0.72ms ~ overlap (+1.27%)
Mandelbrot pass 32.29µs 31.61µs 4.25µs 89.99µs ~ overlap (+2.11%)
NBody pass 400.44µs 399.47µs 26.60µs 432.03µs ~ overlap (+0.24%)
Permute pass 46.09ms 46.25ms 1.91ms 0.69ms ~ overlap (-0.35%)
Queens pass 24.61ms 24.62ms 1.25ms 0.99ms ~ overlap (-0.04%)
Richards pass 1008.64ms 1011.99ms 51.94ms 6.79ms ~ overlap (-0.33%)
Sieve pass 14.44ms 14.63ms 0.57ms 495.53µs ~ overlap (-1.30%)
Storage pass 37.68ms 38.16ms 2.89ms 0.97ms 🔴 -1.25%
Towers pass 65.94ms 67.17ms 3.18ms 1.12ms 🔴 -1.86%

Geomean Ratios

Ratio (row / column) Goccia main Goccia PR QuickJS 2026-06-04 NodeJS v26.5.0
Goccia main 1.000 0.997 18.511 22.394
Goccia PR 1.003 1.000 18.571 22.467
QuickJS 2026-06-04 0.054 0.054 1.000 1.210
NodeJS v26.5.0 0.045 0.045 0.827 1.000

14 pinned AWFY benchmarks. Medians from 5 interleaved samples per engine; raw JSON includes min/max/CV and is attached as the awfy-report artifact. Δ compares PR Goccia median against the same-runner main Goccia median; overlapping min/max ranges are treated as unchanged noise. Rows below 0.5ms are timer-floor sensitive.

@frostney
frostney marked this pull request as ready for review July 21, 2026 01:03
@coderabbitai coderabbitai Bot added documentation Improvements or additions to documentation internal Refactoring, CI, tooling, cleanup labels Jul 21, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@website/src/components/docs-nav.tsx`:
- Around line 14-63: Update the DocsNav grouping logic around GROUPS so every
page is rendered in a SideNavSection. Add a final catch-all “Other” group whose
matcher accepts paths not matched by the preceding groups, preserving the
existing group ordering and avoiding duplicate entries.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ba3ddb40-05f7-4928-b918-3c8e2eb2f082

📥 Commits

Reviewing files that changed from the base of the PR and between 7b50c81 and c4950d3.

⛔ Files ignored due to path filters (12)
  • docs/assets/website-fumadocs-astryx/after-desktop-docs.png is excluded by !**/*.png
  • docs/assets/website-fumadocs-astryx/after-desktop-home.png is excluded by !**/*.png
  • docs/assets/website-fumadocs-astryx/after-mobile-docs-dark.png is excluded by !**/*.png
  • docs/assets/website-fumadocs-astryx/after-mobile-docs-navigation.png is excluded by !**/*.png
  • docs/assets/website-fumadocs-astryx/after-mobile-docs.png is excluded by !**/*.png
  • docs/assets/website-fumadocs-astryx/after-mobile-home.png is excluded by !**/*.png
  • docs/assets/website-fumadocs-astryx/after-opengraph.png is excluded by !**/*.png
  • docs/assets/website-fumadocs-astryx/before-desktop-docs.png is excluded by !**/*.png
  • docs/assets/website-fumadocs-astryx/before-desktop-home.png is excluded by !**/*.png
  • docs/assets/website-fumadocs-astryx/before-mobile-docs.png is excluded by !**/*.png
  • docs/assets/website-fumadocs-astryx/before-mobile-home.png is excluded by !**/*.png
  • website/bun.lock is excluded by !**/*.lock
📒 Files selected for processing (36)
  • website/.gitignore
  • website/README.md
  • website/next.config.d.mts
  • website/next.config.mjs
  • website/package.json
  • website/scripts/sync-docs.mjs
  • website/source.config.ts
  • website/src/__tests__/agent-discovery.test.ts
  • website/src/__tests__/markdown.test.ts
  • website/src/__tests__/sitemap.test.ts
  • website/src/app/docs/[[...slug]]/page.tsx
  • website/src/app/docs/[id]/page.tsx
  • website/src/app/docs/page.tsx
  • website/src/app/globals.css
  • website/src/app/opengraph-image.tsx
  • website/src/app/sitemap.ts
  • website/src/components/command-tabs.tsx
  • website/src/components/docs-mdx.tsx
  • website/src/components/docs-nav.tsx
  • website/src/components/docs.tsx
  • website/src/components/landing.tsx
  • website/src/components/markdown.tsx
  • website/src/components/numbered-code.tsx
  • website/src/components/performance-dashboard.tsx
  • website/src/components/playground.tsx
  • website/src/components/sandbox.tsx
  • website/src/components/site-shell.tsx
  • website/src/components/test262-dashboard.tsx
  • website/src/lib/agent-discovery-header.mjs
  • website/src/lib/agent-discovery.ts
  • website/src/lib/doc-source.ts
  • website/src/lib/docs-data.ts
  • website/src/lib/docs-source.ts
  • website/src/lib/goccia-api.ts
  • website/src/lib/site-markdown.ts
  • website/src/lib/vendor-manifest-server.ts
💤 Files with no reviewable changes (9)
  • website/src/app/docs/page.tsx
  • website/scripts/sync-docs.mjs
  • website/src/lib/doc-source.ts
  • website/src/lib/docs-data.ts
  • website/src/components/docs.tsx
  • website/src/tests/markdown.test.ts
  • website/src/components/numbered-code.tsx
  • website/src/app/docs/[id]/page.tsx
  • website/src/components/markdown.tsx

Comment thread website/src/components/docs-nav.tsx
@frostney
frostney merged commit 31c2977 into main Jul 21, 2026
49 checks passed
@frostney
frostney deleted the codex/website-fumadocs-astryx branch July 21, 2026 01:37
@frostney frostney mentioned this pull request Jul 21, 2026
4 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation internal Refactoring, CI, tooling, cleanup

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant