Skip to content

fix(parser): skip interpolated templates in disabled-feature recovery#889

Merged
frostney merged 2 commits into
mainfrom
claude/clever-rosalind-15418a
Jun 27, 2026
Merged

fix(parser): skip interpolated templates in disabled-feature recovery#889
frostney merged 2 commits into
mainfrom
claude/clever-rosalind-15418a

Conversation

@frostney

Copy link
Copy Markdown
Owner

Summary

  • A disabled traditional for (;;) loop containing an interpolated template literal (e.g. obj[`u${level}`] = level;) reported a misleading SyntaxError: Unterminated template literal at EOF instead of the real "enable --compat-traditional-for-loop" diagnostic at the for keyword.
  • Root cause is in the parser's error-recovery token-skipping. When a disabled feature is rejected, the parser skips its header and body via SkipBalancedParens / SkipBlock / SkipUntilSemicolon. These counted braces naively, but the } that closes a ${ … } substitution is lexed as a plain RightBrace under the default goal (the TemplateMiddle/TemplateTail span is only produced when the lexer runs with the template-tail goal after that }). The skip miscounted the substitution's } as the structural brace ending the region, stopped early, and the trailing backtick was re-scanned as a fresh, unterminated template literal running to EOF.
  • Fix: add a shared SkipTemplateLiteral helper that skips a complete template literal as a unit — recursing through nested substitutions/templates, balancing inner object/block braces, and re-lexing each continuation span with the template-tail goal (mirroring ParseTemplateLiteral). Route the three recovery skips through it.
  • This is the correct scope: the same root cause affected the whole class of disabled-feature recovery skips. Verified fixed for the for-loop block body, non-block body, header, nested templates, object literals inside ${}, and the sibling while / do-while constructs, while the enabled --compat-traditional-for-loop path still parses and executes templates correctly.
  • Non-goal: this does not change the recovery design (disabled constructs remain non-fatal warnings parsed as no-ops); it only makes the token skip template-aware.

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

Added tests (both verified red without the parser change):

  • tests/language/statements/unsupported-features.js — a disabled for-loop with an interpolated template (block body, non-block body, header, nested) is skipped as a clean no-op and subsequent code runs.
  • scripts/test-cli-parser.ts — recovery succeeds in interpreter and bytecode mode, never regresses to Unterminated template literal, and the human-readable diagnostic references --compat-traditional-for-loop.

Verification run:

Check Result
Full JS suite (interpreter) 10960 passed, 0 failed
Full JS suite (bytecode) 10960 passed, 0 failed
bun scripts/test-cli-parser.ts All passed
./format.pas --check 370 files, all formatted correctly
Without the fix (stashed) File fails with SyntaxError: Unterminated template literal (0 passed / 1 failed) — confirms a genuine regression test

🤖 Generated with Claude Code

When the parser rejects a disabled traditional `for (;;)` loop, it records
the warning and skips the loop's header and body via the error-recovery
routines (SkipBalancedParens, SkipBlock, SkipUntilSemicolon). Those routines
counted braces token by token, but the `}` that closes a `${ ... }` template
substitution is lexed as a plain RightBrace under the default goal — the
TemplateMiddle/TemplateTail span is only produced when the lexer is invoked
with the template-tail goal *after* that `}`. So the skip miscounted the
substitution's `}` as the structural brace ending the skipped region, stopped
early, and the trailing backtick was re-scanned as a fresh, unterminated
template literal running to EOF. The result was a misleading
"Unterminated template literal" error at EOF instead of the real
"enable --compat-traditional-for-loop" diagnostic at the `for` keyword.

Add a shared SkipTemplateLiteral helper that skips a complete template literal
as a unit — recursing through nested substitutions and templates, balancing
inner object/block braces, and re-lexing each continuation span with the
template-tail goal (as ParseTemplateLiteral does). Route SkipBlock,
SkipBalancedParens, and SkipUntilSemicolon through it, which fixes the whole
class of disabled-feature recovery skips (for-loop body/header/non-block body,
and the sibling while / do-while constructs), not just the reported case.

Tests (both verified red without the parser change):
- tests/language/statements/unsupported-features.js: a disabled for-loop with
  an interpolated template (block body, non-block body, header, nested) is
  skipped as a clean no-op and subsequent code runs.
- scripts/test-cli-parser.ts: recovery succeeds in interpreter and bytecode
  mode, never regresses to "Unterminated template literal", and the
  human-readable diagnostic references --compat-traditional-for-loop.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 27, 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 Jun 27, 2026 7:21pm

Request Review

@coderabbitai

coderabbitai Bot commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 2706b188-4dc4-499b-86a6-87b783805bdb

📥 Commits

Reviewing files that changed from the base of the PR and between 8690cd3 and 4e156c6.

📒 Files selected for processing (1)
  • scripts/test-cli-parser.ts

📝 Walkthrough

Walkthrough

Adds template-literal-aware parser recovery and expands regression tests for disabled-feature parsing with interpolated template literals in for, while, and do...while cases.

Template-literal error recovery for disabled loops

Layer / File(s) Summary
Template-aware recovery logic
source/units/Goccia.Parser.pas
Declares and implements SkipTemplateLiteral, then uses it from SkipBlock, SkipBalancedParens, and SkipUntilSemicolon so template substitutions are skipped without miscounting structural delimiters.
Disabled-feature regression tests
tests/language/statements/unsupported-features.js, scripts/test-cli-parser.ts
Adds Jest cases for interpolated template literals inside disabled for loops and CLI recovery cases for for, while, and do...while, checking successful recovery, expected stdout, and diagnostics.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested labels

bug

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the main parser recovery fix for interpolated templates.
Description check ✅ Passed The description follows the required Summary and Testing structure and includes key implementation notes plus verification details.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

@coderabbitai coderabbitai Bot added bug Something isn't working internal Refactoring, CI, tooling, cleanup labels Jun 27, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
scripts/test-cli-parser.ts (1)

191-255: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Cover the shared while/do...while recovery path too.

SkipTemplateLiteral is now exercised here only through disabled for recovery, but the same SkipBalancedParens path also drives disabled while and do...while recovery in source/units/Goccia.Parser.pas. Adding one regression per construct would lock down the broader contract this parser change now depends on.

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

In `@scripts/test-cli-parser.ts` around lines 191 - 255, The recovery coverage
here only exercises the disabled traditional for-loop path, but the same
SkipBalancedParens/SkipTemplateLiteral flow is also used by disabled while and
do...while recovery in Goccia.Parser. Extend the recoveryCases in
test-cli-parser.ts with one regression each for while and do...while
template-literal recovery, and keep the same assertions around json.ok,
exitCode, expected output, and the compat-flag diagnostic so the shared parser
contract stays covered.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@scripts/test-cli-parser.ts`:
- Around line 191-255: The recovery coverage here only exercises the disabled
traditional for-loop path, but the same SkipBalancedParens/SkipTemplateLiteral
flow is also used by disabled while and do...while recovery in Goccia.Parser.
Extend the recoveryCases in test-cli-parser.ts with one regression each for
while and do...while template-literal recovery, and keep the same assertions
around json.ok, exitCode, expected output, and the compat-flag diagnostic so the
shared parser contract stays covered.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a4db99c8-bb3b-4d37-9f50-010b63fae0de

📥 Commits

Reviewing files that changed from the base of the PR and between 47c7a04 and 8690cd3.

📒 Files selected for processing (3)
  • scripts/test-cli-parser.ts
  • source/units/Goccia.Parser.pas
  • tests/language/statements/unsupported-features.js

@github-actions

github-actions Bot commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

Suite Timing

Test Runner (interpreted: 10,962 passed; bytecode: 10,962 passed)
Metric Interpreted Bytecode
Total 10962 10962
Passed 10962 ✅ 10962 ✅
Workers 4 4
Test Duration 18.82s 20.13s
Lex (cumulative) 543.3ms 572.6ms
Parse (cumulative) 385.9ms 401.4ms
Compile (cumulative) 826.8ms
Execute (cumulative) 55.6ms 47.28s
Engine Total (cumulative) 984.8ms 49.08s
Lex (avg/worker) 135.8ms 143.1ms
Parse (avg/worker) 96.5ms 100.3ms
Compile (avg/worker) 206.7ms
Execute (avg/worker) 13.9ms 11.82s
Engine Total (avg/worker) 246.2ms 12.27s

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 282.89 MiB 280.31 MiB
GC Peak Live 317.55 MiB 327.81 MiB
GC Allocated During Run 529.02 MiB 473.19 MiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 195 195
GC Collected Objects 2,597,586 2,167,839
Heap Start Allocated 181.0 KiB 181.0 KiB
Heap End Allocated 3.65 MiB 3.65 MiB
Heap Delta Allocated 3.48 MiB 3.48 MiB
Heap Delta Free 1.68 MiB 1.68 MiB
Benchmarks (interpreted: 436; bytecode: 436)
Metric Interpreted Bytecode
Total 436 436
Workers 4 4
Duration 2.92min 2.73min

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 6.28 MiB 6.28 MiB
GC Peak Live 96.10 MiB 85.43 MiB
GC Allocated During Run 16.32 GiB 9.95 GiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 3,697 3,586
GC Collected Objects 257,502,085 219,847,995
Heap Start Allocated 3.36 MiB 3.36 MiB
Heap End Allocated 3.36 MiB 3.36 MiB
Heap Delta Allocated 128 B 128 B

Measured on ubuntu-latest x64.

@github-actions

github-actions Bot commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results

436 benchmarks · PR vs same-runner main build

Interpreted: 🟢 44 improved · 🔴 50 regressed · 342 unchanged · avg +2.6%
Bytecode: 🟢 31 improved · 🔴 29 regressed · 376 unchanged · avg +2.8%

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

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

Deterministic profile diff

Deterministic profile diff: no significant changes.

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

@github-actions

Copy link
Copy Markdown
Contributor

test262 Conformance

Category Run Passed Δ Pass Failed Pass-rate Δ Rate
built-ins 23,643 22,609 +1 1,034 95.6% ±0pp
harness 116 116 ±0 0 100.0% ±0pp
intl402 3,341 3,334 ±0 7 99.8% ±0pp
language 23,711 23,711 ±0 0 100.0% ±0pp
staging 1,482 1,109 +1 373 74.8% +0.1pp
total 52,293 50,879 +2 1,414 97.3% ±0pp

Areas closest to 100%

Area Pass rate Δ vs main Passing
built-ins/TypedArray 99.9% ±0pp 1,445 / 1,446
intl402/Temporal 99.9% ±0pp 2,026 / 2,029
built-ins/Object 99.7% ±0pp 3,401 / 3,411
Per-test deltas (+2 / -0)

Newly passing (2):

  • built-ins/Number/prototype/toExponential/undefined-fractiondigits.js
  • staging/sm/extensions/recursion.js

Steady-state failures are non-blocking; regressions vs the cached main baseline (lower total pass count, or any PASS → non-PASS transition) 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.

The disabled while and do...while recovery paths share the same
SkipBalancedParens / SkipBlock + SkipTemplateLiteral flow as the traditional
for-loop, so extend the CLI parser recovery cases with one regression each:
a while loop with an interpolated template in its condition and a do...while
loop with one in its body. Each case now carries its own compat flag and the
human-readable diagnostic assertion runs per case, so json.ok, exit code,
expected output, and the compat-flag diagnostic stay covered across the whole
shared parser contract.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@coderabbitai coderabbitai Bot removed the internal Refactoring, CI, tooling, cleanup label Jun 27, 2026
@frostney frostney merged commit 2849bc6 into main Jun 27, 2026
15 checks passed
@frostney frostney deleted the claude/clever-rosalind-15418a branch June 27, 2026 20:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant