Skip to content

feat(iterator): implement Iterator.prototype.includes#1026

Draft
frostney wants to merge 2 commits into
mainfrom
issue-1002-iterator-includes
Draft

feat(iterator): implement Iterator.prototype.includes#1026
frostney wants to merge 2 commits into
mainfrom
issue-1002-iterator-includes

Conversation

@frostney

Copy link
Copy Markdown
Owner

Summary

  • Implement the Stage 3 Iterator.prototype.includes(searchElement, skippedElements?) algorithm on the shared per-realm iterator prototype.
  • Reuse the engine's direct-iterator protocol and IsSameValueZero seam while preserving proposal-defined validation, consumption, abrupt completion, and IteratorClose behavior.
  • Add proposal-shaped interpreted/bytecode coverage, register Iterator Includes in Goccia.proposal, and update the public language and built-in documentation.
  • Keep the change in the core built-in layer; it adds no parser, runtime-host, shim, or architecture-policy surface and requires no ADR.

Validated against tc39/proposal-iterator-includes Stage 3 commit 2ce6cbf99a1385465da11ee1ebcd44332134d08e, clause sec-iterator.prototype.includes. The repository's pinned Test262 SHA is 9e61c12835c5e4a3bdba93850427e6742c4f64c4; it contains no Iterator Includes cases. Relevant upstream tests remain unmerged in test262 PR #5031, so this PR does not claim pinned Test262 coverage.

Closes #1002

Testing

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

Commands run:

  • ./build.pas --clean testrunner
  • ./build.pas testrunner
  • ./build/GocciaTestRunner tests/built-ins/Iterator/prototype/includes.js
  • ./build/GocciaTestRunner tests/built-ins/Iterator/prototype/includes.js --mode=bytecode
  • ./build/GocciaTestRunner tests/built-ins/Iterator
  • ./build/GocciaTestRunner tests/built-ins/Iterator --mode=bytecode
  • ./build/GocciaTestRunner tests — 1,443 files; 11,543 tests; 25,825 assertions passed
  • ./build/GocciaTestRunner tests --mode=bytecode — 1,443 files; 11,543 tests; 25,825 assertions passed
  • bun run scripts/check-test-structure.ts
  • ./format.pas --check

@vercel

vercel Bot commented Jul 23, 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 Jul 23, 2026 12:08am

Request Review

@coderabbitai

coderabbitai Bot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Draft detected.

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

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 58d11180-37c5-4a1d-b25b-e5bfbd97862b

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@github-actions

github-actions Bot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Web Tooling Benchmark

Workload Status Goccia
acorn pass 0.03 runs/s
babel pass 0.01 runs/s
babel-minify pass 0.09 runs/s
babylon pass 0.04 runs/s
buble pass 0.10 runs/s
chai pass 0.08 runs/s
coffeescript pass 0.01 runs/s
espree pass 0.03 runs/s
esprima pass 0.04 runs/s
jshint pass 0.01 runs/s
lebab pass 0.07 runs/s
postcss pass 0.02 runs/s
prepack pass 0.10 runs/s
prettier pass 0.10 runs/s
source-map pass 0.03 runs/s
terser pass 207 runs/s
typescript pass 0.13 runs/s
uglify-js pass 118 runs/s

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

@github-actions

github-actions Bot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Suite Timing

Test Runner (interpreted: 11,543 passed; bytecode: 11,543 passed)
Metric Interpreted Bytecode
Total 11543 11543
Passed 11543 ✅ 11543 ✅
Workers 4 4
Test Duration 18.14s 17.44s
Lex (cumulative) 1.73s 1.78s
Parse (cumulative) 923.6ms 964.0ms
Compile (cumulative) 1.12s
Execute (cumulative) 884.0ms 16.03s
Engine Total (cumulative) 3.53s 19.90s
Lex (avg/worker) 431.3ms 445.3ms
Parse (avg/worker) 230.9ms 241.0ms
Compile (avg/worker) 281.1ms
Execute (avg/worker) 221.0ms 4.01s
Engine Total (avg/worker) 883.2ms 4.98s

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 66.59 MiB 63.17 MiB
GC Peak Live 210.92 MiB 186.66 MiB
GC Allocated During Run 522.89 MiB 455.45 MiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 226 226
GC Collected Objects 4,387,557 3,848,890
Heap Start Allocated 326.6 KiB 326.6 KiB
Heap End Allocated 2.90 MiB 2.90 MiB
Heap Delta Allocated 2.58 MiB 2.58 MiB
Heap Delta Free 2.24 MiB 2.23 MiB
Benchmarks (interpreted: 439; bytecode: 439)
Metric Interpreted Bytecode
Total 439 439
Workers 4 4
Duration 3.13min 2.95min

Memory

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

Metric Interpreted Bytecode
GC Live 808 B 808 B
GC Peak Live 150.81 MiB 68.71 MiB
GC Allocated During Run 15.82 GiB 9.74 GiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 5,814 5,056
GC Collected Objects 230,928,723 215,328,445
Heap Start Allocated 1.36 MiB 1.36 MiB
Heap End Allocated 1.37 MiB 1.37 MiB
Heap Delta Allocated 3.2 KiB 3.2 KiB
Boot
Metric Interpreted Bytecode
Boot (median) 7.2ms 7.1ms
Boot (min) 6.6ms 6.7ms

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

Measured on ubuntu-latest x64.

@github-actions

github-actions Bot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results

439 benchmarks · PR vs same-runner main build

Interpreted: 🟢 26 improved · 🔴 45 regressed · 368 unchanged · avg -0.8%
Bytecode: 🟢 47 improved · 🔴 56 regressed · 336 unchanged · avg +0.6%

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

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

Deterministic profile diff

Deterministic profile diff: no significant changes.

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

@github-actions

github-actions Bot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

AWFY Results

Target Status Goccia main Goccia PR QuickJS 2026-06-04 NodeJS v26.5.0 Δ PR vs main
Bounce pass 17.04ms 17.14ms 0.76ms 0.86ms ~ overlap (-0.57%)
CD pass 161.65ms 159.95ms 7.93ms 7.96ms ~ overlap (+1.05%)
DeltaBlue pass 3.68ms 3.79ms 220.77µs 1.25ms ~ overlap (-2.98%)
Havlak pass 64.28s 64.74s 3029.78ms 153.42ms 🔴 -0.72%
Json pass 270.77ms 273.96ms 10.18ms 3.44ms ~ overlap (-1.18%)
List pass 12.67ms 12.84ms 0.79ms 0.57ms ~ overlap (-1.39%)
Mandelbrot pass 21.15µs 22.09µs 3.90µs 69.48µs ~ overlap (-4.43%)
NBody pass 270.74µs 269.01µs 21.27µs 301.65µs ~ overlap (+0.64%)
Permute pass 33.23ms 33.84ms 1.32ms 0.60ms 🔴 -1.83%
Queens pass 17.71ms 17.93ms 0.89ms 0.86ms 🔴 -1.27%
Richards pass 744.54ms 757.92ms 40.37ms 4.88ms 🔴 -1.80%
Sieve pass 10.23ms 10.36ms 383.38µs 441.01µs ~ overlap (-1.20%)
Storage pass 26.08ms 26.14ms 1.80ms 0.80ms ~ overlap (-0.20%)
Towers pass 48.38ms 48.63ms 2.19ms 0.87ms ~ overlap (-0.51%)

Geomean Ratios

Ratio (row / column) Goccia main Goccia PR QuickJS 2026-06-04 NodeJS v26.5.0
Goccia main 1.000 0.989 17.993 20.100
Goccia PR 1.012 1.000 18.202 20.333
QuickJS 2026-06-04 0.056 0.055 1.000 1.117
NodeJS v26.5.0 0.050 0.049 0.895 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.

@github-actions

github-actions Bot commented Jul 23, 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.53 0.52 13.48 346.11 25.81× 662.49×
ai-astar pass 1.55 1.54 41.36 355.24 26.82× 230.42×
gaussian-blur pass 0.34 0.35 7.53 283.23 21.58× 811.76×
raytrace-public-class-fields pass 0.40 0.39 11.14 189.32 28.34× 481.55×
sync-fs pass 0.91 0.87 27.50 225.26 31.60× 258.86×
lazy-collections pass 2.89 2.86 91.90 200.42 32.16× 70.14×

Geomean reference ratio: QuickJS 27.48×; Node.js 320.48×.

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

@github-actions

Copy link
Copy Markdown
Contributor

test262 Conformance

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

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

Areas closest to 100%

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

New timeouts (3):

  • language/identifiers/start-unicode-10.0.0-class-escaped.js
  • language/identifiers/start-unicode-10.0.0-class.js
  • staging/sm/TypedArray/element-setting-converts-using-ToNumber.js

Resolved timeouts (1):

  • staging/sm/extensions/recursion.js

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

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.

Implement Iterator.prototype.includes

1 participant