Skip to content

feat(modules): add gated remote package imports - #1054

Draft
frostney wants to merge 2 commits into
mainfrom
codex/issue-1053-remote-import-packages
Draft

frostney wants to merge 2 commits into
mainfrom
codex/issue-1053-remote-import-packages

Conversation

@frostney

Copy link
Copy Markdown
Owner

Summary

  • Add mixed local and github: provider entries to the existing import-map resolver.
  • Require an explicit --remote-imports capability before any lockfile or cache access, with dedicated allow/deny audit events.
  • Materialize only lockfile-pinned, SHA-256-verified universal and current-platform artifacts through derived GET-only provider URLs.
  • Preserve verified offline cache reuse and reject raw HTTP(S), Node/npm resolution, unsafe paths, unpinned refs, and mismatched content.
  • Document the lockfile/cache contract and the resolver-time materialization decision in ADR 0103.

The first provider slice is deliberately GitHub-only. Lockfile creation and updates remain explicit external maintenance, and GocciaSandboxRunner does not expose the host-backed package cache in this slice.

Closes #1053

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:

  • ./build.pas tests
  • Focused native suites: SHA-256 (3/3), remote packages (7/7), module resolver (4/4), module configuration (5/5)
  • ./build.pas loader sandboxrunner testrunner
  • ./build/GocciaTestRunner tests — 11,669/11,669
  • ./build/GocciaTestRunner tests --mode=bytecode — 11,669/11,669
  • ./format.pas --check — 438 files
  • Host integration fixture: one mixed import map resolved a cached remote ES module plus a platform-native artifact without network access, emitted remote-import.resolve: allow, and rejected the same populated cache without --remote-imports while emitting deny
  • Pre-commit documentation length, links, symbols, duplication, Markdown, truncation guards, and Pascal formatting gates

Manual check gate

Please review the committed goccia.lock.json schema/provider syntax and the intentional first-slice boundary before marking ready. A real GocciaScript-Raylib package lock/artifact set can then exercise the provider path end to end. This PR is intentionally left as a draft; no review automation has been triggered.

@vercel

vercel Bot commented Jul 26, 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 26, 2026 11:24am

Request Review

@coderabbitai

coderabbitai Bot commented Jul 26, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: df8c7c54-b7d3-430d-b908-425eb60ea007

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@github-actions

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.09 runs/s
babylon pass 0.04 runs/s
buble pass 0.09 runs/s
chai pass 0.12 runs/s
coffeescript pass 0.01 runs/s
espree pass 0.03 runs/s
esprima pass 0.04 runs/s
jshint pass 0.01 runs/s
lebab pass 0.08 runs/s
postcss pass 0.02 runs/s
prepack pass 0.11 runs/s
prettier pass 0.07 runs/s
source-map pass 0.03 runs/s
terser pass 206 runs/s
typescript pass 0.15 runs/s
uglify-js pass 121 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

Copy link
Copy Markdown
Contributor

Suite Timing

Test Runner (interpreted: 11,669 passed; bytecode: 11,669 passed)
Metric Interpreted Bytecode
Total 11669 11669
Passed 11669 ✅ 11669 ✅
Workers 4 4
Test Duration 17.44s 17.74s
Lex (cumulative) 1.76s 1.83s
Parse (cumulative) 947.9ms 994.0ms
Compile (cumulative) 1.18s
Execute (cumulative) 334.0ms 16.40s
Engine Total (cumulative) 3.04s 20.40s
Lex (avg/worker) 439.3ms 456.8ms
Parse (avg/worker) 237.0ms 248.5ms
Compile (avg/worker) 294.4ms
Execute (avg/worker) 83.5ms 4.10s
Engine Total (avg/worker) 759.8ms 5.10s

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 65.72 MiB 64.24 MiB
GC Peak Live 217.58 MiB 183.80 MiB
GC Allocated During Run 531.32 MiB 460.51 MiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 226 226
GC Collected Objects 4,431,166 3,872,595
Heap Start Allocated 330.3 KiB 330.3 KiB
Heap End Allocated 2.90 MiB 2.90 MiB
Heap Delta Allocated 2.58 MiB 2.58 MiB
Heap Delta Free 2.54 MiB 2.54 MiB
Benchmarks (interpreted: 439; bytecode: 439)
Metric Interpreted Bytecode
Total 439 439
Workers 4 4
Duration 3.15min 3.04min

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 152.13 MiB 71.69 MiB
GC Allocated During Run 16.32 GiB 9.78 GiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 6,624 6,239
GC Collected Objects 234,220,753 214,605,900
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.3ms 7.3ms
Boot (min) 7.1ms 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

Copy link
Copy Markdown
Contributor

Benchmark Results

439 benchmarks · PR vs same-runner main build

Interpreted: 🟢 20 improved · 🔴 34 regressed · 385 unchanged · avg +0.9%
Bytecode: 🟢 31 improved · 🔴 70 regressed · 338 unchanged · avg +0.5%

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

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

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

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.55 0.55 13.64 340.40 24.75× 617.48×
ai-astar pass 1.62 1.64 40.08 343.83 24.45× 209.72×
gaussian-blur pass 0.39 0.39 7.95 282.67 20.62× 732.85×
raytrace-public-class-fields pass 0.41 0.41 10.92 191.33 26.77× 469.05×
sync-fs pass 1.11 1.12 33.81 229.22 30.24× 205.02×
lazy-collections pass 2.34 2.37 69.59 158.43 29.34× 66.79×

Geomean reference ratio: QuickJS 25.82×; Node.js 291.18×.

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

Copy link
Copy Markdown
Contributor

test262 Conformance

14 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 ±0 0 0 ±0 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,710 ±0 1 2 ±0 0 100.0% ±0pp
staging 1,482 1,385 +1 86 11 -1 0 93.5% +0.1pp
total 52,328 52,219 +1 95 14 -1 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 / -1)

Resolved timeouts (1):

  • staging/sm/extensions/recursion.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

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 22.41ms 22.37ms 1.04ms 1.19ms ~ overlap (+0.17%)
CD pass 213.91ms 215.44ms 10.72ms 9.55ms ~ overlap (-0.72%)
DeltaBlue pass 4.91ms 4.94ms 306.13µs 1.78ms ~ overlap (-0.54%)
Havlak pass 83.82s 83.37s 4106.19ms 181.17ms ~ overlap (+0.53%)
Json pass 360.65ms 358.63ms 14.68ms 5.13ms ~ overlap (+0.56%)
List pass 15.19ms 14.47ms 1.02ms 0.73ms 🟢 +4.74%
Mandelbrot pass 28.80µs 30.70µs 4.97µs 91.28µs ~ overlap (-6.58%)
NBody pass 412.28µs 413.97µs 27.98µs 393.30µs ~ overlap (-0.41%)
Permute pass 43.09ms 42.82ms 1.90ms 0.71ms ~ overlap (+0.61%)
Queens pass 22.85ms 22.27ms 1.28ms 1.05ms 🟢 +2.55%
Richards pass 948.21ms 933.56ms 51.63ms 7.03ms 🟢 +1.54%
Sieve pass 12.76ms 12.70ms 0.56ms 0.53ms ~ overlap (+0.47%)
Storage pass 35.78ms 35.49ms 2.94ms 1.07ms ~ overlap (+0.81%)
Towers pass 63.42ms 62.75ms 3.14ms 1.11ms ~ overlap (+1.05%)

Geomean Ratios

Ratio (row / column) Goccia main Goccia PR QuickJS 2026-06-04 NodeJS v26.5.0
Goccia main 1.000 1.004 17.097 20.386
Goccia PR 0.996 1.000 17.034 20.311
QuickJS 2026-06-04 0.058 0.059 1.000 1.192
NodeJS v26.5.0 0.049 0.049 0.839 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add capability-gated remote package resolution to import maps

1 participant