Skip to content

Fix YAML harness cleanup on parse failure#218

Merged
frostney merged 2 commits into
mainfrom
fix/unreachable-cleanup-yaml-harness
Apr 8, 2026
Merged

Fix YAML harness cleanup on parse failure#218
frostney merged 2 commits into
mainfrom
fix/unreachable-cleanup-yaml-harness

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Apr 8, 2026

Summary

  • Move parser and source cleanup into a finally block so they always run.
  • Ensure TGarbageCollector.Shutdown executes even when YAML loading or parsing raises an exception.
  • Preserve the existing exit status and error message behavior for failures.

Fixes #167

Restructure the embedded Pascal harness in run_yaml_test_suite.py to use
try..finally so Parser.Free, Source.Free, and TGarbageCollector.Shutdown
are always reachable. Previously, Halt(0) in the try block made these
cleanup calls dead code.

Fixes #167

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 8, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 7f93c349-69dc-46da-bf02-30c58d4c8ae4

📥 Commits

Reviewing files that changed from the base of the PR and between 09122a8 and 0b6508e.

📒 Files selected for processing (1)
  • scripts/run_yaml_test_suite.py

📝 Walkthrough

Walkthrough

The embedded Pascal harness in the YAML test runner was restructured to guarantee resource cleanup execution. A nested try/finally pattern now wraps the existing try/except block, moving parser, source, and garbage collector cleanup operations into the finally clause, ensuring they execute regardless of success or exception path.

Changes

Cohort / File(s) Summary
Pascal Harness Exception Handling
scripts/run_yaml_test_suite.py
Restructured control flow by nesting try/except inside try/finally; moved Parser.Free, Source.Free, and TGarbageCollector.Shutdown into finally block; removed early Halt(0) from success path to allow normal flow to cleanup.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description covers the key changes and references the fixed issue (#167), but lacks testing verification checkboxes as required by the repository template. Complete the testing section by checking off relevant boxes or indicating which tests were verified to ensure the fix works correctly.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title directly and concisely describes the main change: fixing cleanup code in the YAML harness that was previously unreachable on parse failure.
Linked Issues check ✅ Passed The PR successfully addresses issue #167 by restructuring the Pascal harness to use try..finally, ensuring cleanup code always executes and preserving existing exit status behavior.
Out of Scope Changes check ✅ Passed All changes are directly related to fixing the unreachable cleanup code issue in the YAML harness; no out-of-scope modifications are present.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@scripts/run_yaml_test_suite.py`:
- Around line 49-54: The except block currently calls Halt(1), which aborts the
process and prevents outer finally cleanup (Parser.Free, Source.Free,
TGarbageCollector.Shutdown) from running; change the exception handling so it
does not call Halt: capture/log E.Message as now, set the global ExitCode := 1
(or store an error flag) and allow the exception handler to return (do not
re-raise), so the outer finally can run and perform cleanup; locate the except
block that references Halt(1) and replace the Halt call with setting ExitCode
(or an error flag) and returning control to let Parser.Free, Source.Free, and
TGarbageCollector.Shutdown execute.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: fef6c285-20f7-4d8f-9e45-c53d5f9e1778

📥 Commits

Reviewing files that changed from the base of the PR and between a4bbae5 and 09122a8.

📒 Files selected for processing (1)
  • scripts/run_yaml_test_suite.py

Comment thread scripts/run_yaml_test_suite.py
Halt() in FreePascal terminates immediately without executing enclosing
try..finally blocks. Use an ExitCode variable instead so the finally
block runs cleanup before the process exits.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 8, 2026

Benchmark Results

274 benchmarks

Interpreted: 🟢 146 improved · 🔴 51 regressed · 77 unchanged · avg +2.2%
Bytecode: 🟢 68 improved · 🔴 73 regressed · 133 unchanged · avg +0.2%

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

Measured on ubuntu-latest x64. Benchmark ranges compare cached main-branch min/max ops/sec with the PR run; overlapping ranges are treated as unchanged noise. Percentage deltas are secondary context.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 8, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 3797 3797
Tests Passed 3756 ✅ 3797 ✅
Tests Skipped 41 0
Tests Test Duration 216.5ms 199.1ms
Tests Lex 72.5ms 49.1ms
Tests Parse 92.3ms 96.0ms
Tests Compile 54.8ms
Tests Execute 231.9ms 225.8ms
Tests Engine Total 396.7ms 425.7ms
Benchmarks Total 274 274
Benchmarks Duration 7.72min 6.41min

Measured on ubuntu-latest x64.

@frostney frostney merged commit 11fe493 into main Apr 8, 2026
9 checks passed
@frostney frostney deleted the fix/unreachable-cleanup-yaml-harness branch April 8, 2026 12:03
@frostney frostney added the bug Something isn't working label Apr 9, 2026
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.

scripts/run_yaml_test_suite.py: Fix unreachable cleanup code in embedded Pascal harness

1 participant