Skip to content

fix(shadowrealm): unpin ShadowRealm.prototype at host teardown - #1209

Merged
frostney merged 1 commit into
claude/r4-cr-round2-strictness-symlinkfrom
claude/r4-shadowrealm-warmup
Aug 24, 2026
Merged

fix(shadowrealm): unpin ShadowRealm.prototype at host teardown#1209
frostney merged 1 commit into
claude/r4-cr-round2-strictness-symlinkfrom
claude/r4-shadowrealm-warmup

Conversation

@frostney

@frostney frostney commented Aug 22, 2026

Copy link
Copy Markdown
Owner

Summary

  • Fixes a segfault: importing any runtime module (node:async_hooks, goccia:csv, goccia:timers) from a directory with unsafe-shadowrealm: true in a multi-file run crashed during warm-up.
  • Root cause was a leaked GC pin — the ShadowRealm host pinned ShadowRealm.prototype for the engine's lifetime but never released it at teardown, so the next per-file GC.Collect marked a surviving-but-dangling prototype and walked into a freed realm graph (EXC_BAD_ACCESS in MarkRoots). The host destructor now unpins the prototype before freeing child realms; a pure lifetime fix that grants the child no capability and preserves realm isolation.

Testing

  • Full suite both modes; committed multi-file unsafe-shadowrealm warm-up regression test that faults before the fix
  • lldb backtrace + mutation confirming the pin as the cause; heaptrc clean
  • Differential zero divergence under bun 1.4.0 and CI-pinned 1.3.14; ./format.pas --check and doc checks clean

@vercel

vercel Bot commented Aug 22, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
gocciascript-homepage Ignored Ignored Preview Aug 24, 2026 12:56am

Request Review

@coderabbitai

coderabbitai Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

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: 682c8db6-c13d-4095-95fd-2e1f007013cd

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

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: b27b478b-bb7c-41d8-a89a-2f9ac80433db

📥 Commits

Reviewing files that changed from the base of the PR and between fb169b9 and 5ab8635.

📒 Files selected for processing (3)
  • source/units/Goccia.Builtins.GlobalShadowRealm.pas
  • tests/built-ins/ShadowRealm/runtime-module-warmup/async-hooks-import.js
  • tests/built-ins/ShadowRealm/runtime-module-warmup/csv-import.js

Limit details: You’ve used all 5 included reviews currently available. Your 53 included PR review attempts over the past 7 days set your current allowance at 5 reviews per hour.


📝 Walkthrough

Walkthrough

The ShadowRealm host destructor now unpins FPrototype before freeing child realms and wrapped hosts. Regression tests cover node:async_hooks and goccia:csv runtime-module warm-up.

Changes

ShadowRealm lifecycle

Layer / File(s) Summary
Prototype cleanup and regression tests
source/units/Goccia.Builtins.GlobalShadowRealm.pas, tests/built-ins/ShadowRealm/runtime-module-warmup/*.js
The destructor releases the FPrototype garbage-collector pin. Regression tests validate runtime-module behavior and continued ShadowRealm construction and evaluation.

Estimated code review effort: 2 (Simple) | ~10 minutes

Merge Risk: ⚪ Minimal · up to 5ab86

The change releases the ShadowRealm prototype pin during host teardown to prevent the reported multi-file warm-up crash while preserving realm isolation; no actionable merge-blocking risk remains beyond normal checks.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely identifies the primary fix: releasing the ShadowRealm prototype pin during host teardown.
Description check ✅ Passed The description explains the cause, fix, constraints, and testing results, and it follows the required Summary and Testing sections.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 2 files. (1 skipped: 1 unsupported.)
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch

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

@frostney
frostney marked this pull request as ready for review August 22, 2026 16:00
@github-actions

github-actions Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Web Tooling Benchmark

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

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

@github-actions

github-actions Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

JetStream 3 Performance Barometer

Workload Status Goccia main Goccia PR QuickJS Node.js vs QuickJS vs Node.js
hash-map pass 0.80 0.80 17.95 408.66 22.47× 511.77×
ai-astar pass 1.68 1.69 42.79 355.86 25.35× 210.84×
gaussian-blur pass 0.35 0.35 8.01 300.84 22.78× 855.23×
raytrace-public-class-fields pass 0.42 0.43 11.51 197.99 26.65× 458.68×
sync-fs pass 1.02 1.02 33.57 239.50 32.96× 235.15×
lazy-collections pass 1.99 2.01 68.73 148.85 34.19× 74.05×

Geomean reference ratio: QuickJS 27.03×; Node.js 300.55×.

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

@github-actions

github-actions Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Suite Timing

Test Runner (interpreted: 12,763 passed; bytecode: 12,763 passed)
Metric Interpreted Bytecode
Total 12763 12763
Passed 12763 ✅ 12763 ✅
Workers 4 4
Test Duration 18.85s 15.95s
Lex (cumulative) 1.85s 1.51s
Parse (cumulative) 994.7ms 804.9ms
Compile (cumulative) 1.06s
Execute (cumulative) 801.0ms 16.85s
Engine Total (cumulative) 3.65s 20.23s
Lex (avg/worker) 462.7ms 376.9ms
Parse (avg/worker) 248.7ms 201.2ms
Compile (avg/worker) 265.9ms
Execute (avg/worker) 200.2ms 4.21s
Engine Total (avg/worker) 911.6ms 5.06s

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 55.82 MiB 55.45 MiB
GC Peak Live 204.75 MiB 168.21 MiB
GC Allocated During Run 698.02 MiB 609.35 MiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 998 1,004
GC Collected Objects 5,464,742 4,736,385
Heap Start Allocated 368.5 KiB 368.5 KiB
Heap End Allocated 2.99 MiB 2.99 MiB
Heap Delta Allocated 2.63 MiB 2.63 MiB
Heap Delta Free 2.22 MiB 2.22 MiB
Benchmarks (interpreted: 440; bytecode: 440)
Metric Interpreted Bytecode
Total 440 440
Workers 4 4
Duration 3.42min 2.86min

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 85.0 KiB 85.0 KiB
GC Peak Live 297.56 MiB 335.09 MiB
GC Allocated During Run 22.06 GiB 12.44 GiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 6,905 5,478
GC Collected Objects 256,350,315 170,702,856
Heap Start Allocated 1.37 MiB 1.37 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.8ms 8.1ms
Boot (min) 7.5ms 7.8ms

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

Measured on ubuntu-latest x64.

@github-actions

github-actions Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results

440 benchmarks · PR vs same-runner main build

Interpreted: 🟢 34 improved · 🔴 25 regressed · 381 unchanged · avg +1.2%
Bytecode: 🟢 26 improved · 🔴 51 regressed · 363 unchanged · avg +0.0%

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

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

Deterministic profile diff

Deterministic profile diff: no significant changes.

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

@github-actions

github-actions Bot commented Aug 22, 2026

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,812 23,719 +1 93 0 -1 0 99.6% ±0pp
harness 116 116 ±0 0 0 ±0 0 100.0% ±0pp
intl402 3,357 3,344 ±0 12 1 ±0 0 99.6% ±0pp
language 23,724 23,715 -2 7 2 +2 0 100.0% ±0pp
staging 1,483 1,387 +1 85 11 -1 0 93.5% +0.1pp
total 52,492 52,281 ±0 197 14 ±0 0 99.6% ±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
language/statements 99.9% ±0pp 9,341 / 9,347
Per-test deltas (+0 / -0 / timeout +2 / -2)

New timeouts (2):

  • language/identifiers/start-unicode-10.0.0-class-escaped.js
  • language/identifiers/start-unicode-10.0.0-class.js

Resolved timeouts (2):

  • built-ins/decodeURI/S15.1.3.1_A2.5_T1.js
  • 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

github-actions Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

AWFY Results

Target Status Goccia main Goccia PR QuickJS 2026-06-04 NodeJS v26.7.0 Δ PR vs main
Bounce pass 21.86ms 22.01ms 1.09ms 1.05ms ~ overlap (-0.68%)
CD pass 199.89ms 200.07ms 9.86ms 9.42ms ~ overlap (-0.09%)
DeltaBlue pass 4.49ms 4.48ms 295.49µs 1.56ms ~ overlap (+0.23%)
Havlak pass 78.65s 78.28s 4151.18ms 186.52ms 🟢 +0.46%
Json pass 342.31ms 342.96ms 14.15ms 4.32ms ~ overlap (-0.19%)
List pass 13.49ms 13.37ms 1.00ms 0.77ms ~ overlap (+0.87%)
Mandelbrot pass 31.99µs 30.79µs 5.70µs 95.04µs ~ overlap (+3.75%)
NBody pass 410.71µs 403.24µs 29.50µs 338.63µs ~ overlap (+1.82%)
Permute pass 40.07ms 40.41ms 1.86ms 0.78ms ~ overlap (-0.86%)
Queens pass 21.24ms 21.09ms 1.30ms 1.12ms ~ overlap (+0.75%)
Richards pass 829.16ms 830.72ms 51.89ms 6.49ms ~ overlap (-0.19%)
Sieve pass 12.60ms 13.22ms 0.58ms 0.55ms 🔴 -4.86%
Storage pass 36.83ms 37.76ms 3.11ms 1.04ms 🔴 -2.53%
Towers pass 58.13ms 58.16ms 3.10ms 1.15ms ~ overlap (-0.05%)

Geomean Ratios

Ratio (row / column) Goccia main Goccia PR QuickJS 2026-06-04 NodeJS v26.7.0
Goccia main 1.000 0.999 16.134 19.954
Goccia PR 1.001 1.000 16.149 19.972
QuickJS 2026-06-04 0.062 0.062 1.000 1.237
NodeJS v26.7.0 0.050 0.050 0.809 1.000

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

@frostney

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@frostney

Copy link
Copy Markdown
Owner Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Full review finished.


Your included review limit is currently reached under our Fair Usage Limits Policy. Your current included review allowance is based on your included PR review attempts over the past 7 days. This review may still proceed through usage-based billing if eligible. Your next included review will be available in 12 minutes.

@frostney
frostney force-pushed the claude/r4-shadowrealm-warmup branch from 5ab8635 to 78b6808 Compare August 23, 2026 23:12
Release the GC pin on the child realm's prototype in the ShadowRealm host
destructor so a later per-file collection cannot mark a freed realm graph.
Fixes the multi-file unsafe-shadowrealm runtime-module warm-up segfault.
@frostney
frostney force-pushed the claude/r4-shadowrealm-warmup branch from 78b6808 to 4a7e703 Compare August 24, 2026 00:55
@frostney
frostney merged commit e2fb7d5 into main Aug 24, 2026
130 of 150 checks passed
@frostney
frostney deleted the claude/r4-shadowrealm-warmup branch August 24, 2026 08:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant