Skip to content

Centralize FExecuting re-entrancy guard into TGocciaIteratorHelperValue (#581)#589

Merged
frostney merged 2 commits into
mainfrom
t3code/issue-581
May 9, 2026
Merged

Centralize FExecuting re-entrancy guard into TGocciaIteratorHelperValue (#581)#589
frostney merged 2 commits into
mainfrom
t3code/issue-581

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented May 8, 2026

Summary

  • Introduce TGocciaIteratorHelperValue as a template-method base class between TGocciaIteratorValue and all 8 iterator helper classes (concat, map, filter, take, drop, flatMap, zip, zipKeyed).
  • The base class owns FExecuting and overrides AdvanceNext/DirectNext with the re-entrancy guard + try/finally, delegating to abstract DoAdvanceNext/DoDirectNext that subclasses implement. This mirrors the spec's GeneratorResume structure (ES2026 §27.1.2.1.1).
  • Eliminates 8 duplicated field declarations and 16 duplicated guard sites. Non-helper iterators (array, string, map-entry, set-entry, generator, generic) are unaffected.
  • Update docs/value-system.md class diagram to reflect the new hierarchy and add previously missing Concat/Zip/ZipKeyed entries.

Closes #581

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

frostney and others added 2 commits May 8, 2026 22:58
…ue base class (#581)

Introduce TGocciaIteratorHelperValue as a template-method base between
TGocciaIteratorValue and all 8 iterator helper classes. The base owns
FExecuting and overrides AdvanceNext/DirectNext with the guard +
try/finally, delegating to abstract DoAdvanceNext/DoDirectNext that
subclasses implement. This mirrors the spec's GeneratorResume structure
and eliminates 8 field declarations and 16 duplicated guard sites.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add the new intermediate class and missing Concat/Zip/ZipKeyed entries.

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

vercel Bot commented May 8, 2026

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

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
gocciascript-homepage Ignored Ignored May 8, 2026 10:00pm

Request Review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 8, 2026

Review Change Stack

📝 Walkthrough

Walkthrough

This PR introduces TGocciaIteratorHelperValue, a shared base class that centralizes the FExecuting re-entrancy guard and abstract delegation pattern. Eight iterator helper classes (concat, lazy map/filter/take/drop/flatMap, zip, zipKeyed) are refactored to inherit from it, replacing direct AdvanceNext/DirectNext overrides with protected DoAdvanceNext/DoDirectNext implementations. Documentation is updated to reflect the new type hierarchy.

Changes

Iterator Helper Base Class Centralization

Layer / File(s) Summary
Base Class Definition
source/units/Goccia.Values.IteratorValue.pas
Adds TGocciaIteratorHelperValue with FExecuting guard, abstract DoAdvanceNext/DoDirectNext delegation methods, and public AdvanceNext/DirectNext overrides that enforce non-reentrancy and delegate to subclass implementations.
Concat Iterator Refactoring
source/units/Goccia.Values.Iterator.Concat.pas
TGocciaConcatIteratorValue inherits from TGocciaIteratorHelperValue and implements DoAdvanceNext/DoDirectNext to handle inner iterator sequencing, exhaustion, and exception preservation.
Lazy Iterator Refactoring
source/units/Goccia.Values.Iterator.Lazy.pas
Five lazy iterator classes (map, filter, take, drop, flatMap) inherit from TGocciaIteratorHelperValue and move their transformation logic into protected DoAdvanceNext/DoDirectNext methods.
Zip Iterator Refactoring
source/units/Goccia.Values.Iterator.Zip.pas
TGocciaZipIteratorValue and TGocciaZipKeyedIteratorValue inherit from TGocciaIteratorHelperValue, move result construction and termination-mode logic into DoAdvanceNext/DoDirectNext, and manage GC temp roots.
Type Hierarchy Documentation
docs/value-system.md
Mermaid class diagram is updated to show TGocciaIteratorHelperValue as an intermediate base and documents all 8 derived iterator helper classes.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • frostney/GocciaScript#579: Introduces the initial FExecuting re-entrancy guard pattern across 8 iterator helper classes that this PR consolidates into a shared base class.
  • frostney/GocciaScript#581: Tracks the objective to centralize the duplicated re-entrancy guard pattern into a TGocciaIteratorHelperValue base class.
  • frostney/GocciaScript#587: Adds re-entrancy tests verifying the FExecuting guard behavior across iterator helpers that are refactored in this PR.

Suggested labels

internal, refactoring, documentation

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the main change: centralizing the FExecuting re-entrancy guard into a new TGocciaIteratorHelperValue base class, directly reflecting the PR's primary objective.
Description check ✅ Passed The PR description fully follows the template structure with a complete Summary section, clear objective statement (Closes #581), and all Testing checkboxes filled (2 checked, 2 unchecked with optional note), meeting template requirements.
Linked Issues check ✅ Passed All coding requirements from #581 are met: TGocciaIteratorHelperValue introduced with FExecuting guard, abstract DoAdvanceNext/DoDirectNext methods implemented, all 8 helper classes refactored to inherit from it, and documentation updated.
Out of Scope Changes check ✅ Passed All changes are directly aligned with #581 objectives: TGocciaIteratorHelperValue introduction, refactoring 8 helper classes to use it, and updating documentation. No unrelated modifications 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.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 8, 2026

Suite Timing

Test Runner (interpreted: 8,989 passed; bytecode: 8,989 passed)
Metric Interpreted Bytecode
Total 8989 8989
Passed 8989 ✅ 8989 ✅
Workers 4 4
Test Duration 1.90s 2.01s
Lex (cumulative) 241.0ms 158.4ms
Parse (cumulative) 275.5ms 254.9ms
Compile (cumulative) 544.1ms
Execute (cumulative) 1.81s 1.74s
Engine Total (cumulative) 2.33s 2.70s
Lex (avg/worker) 60.3ms 39.6ms
Parse (avg/worker) 68.9ms 63.7ms
Compile (avg/worker) 136.0ms
Execute (avg/worker) 452.8ms 435.0ms
Engine Total (avg/worker) 582.0ms 674.3ms

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 228.54 MiB 223.06 MiB
GC Peak Live 228.54 MiB 223.06 MiB
GC Allocated During Run 232.36 MiB 226.87 MiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 1 1
GC Collected Objects 74 74
Heap Start Allocated 146.6 KiB 146.6 KiB
Heap End Allocated 1.37 MiB 1.37 MiB
Heap Delta Allocated 1.23 MiB 1.23 MiB
Heap Delta Free 468.6 KiB 468.6 KiB
Benchmarks (interpreted: 407; bytecode: 407)
Metric Interpreted Bytecode
Total 407 407
Workers 4 4
Duration 2.51min 2.30min

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 3.40 MiB 3.40 MiB
GC Peak Live 107.10 MiB 72.87 MiB
GC Allocated During Run 15.57 GiB 9.58 GiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 2,832 2,641
GC Collected Objects 289,424,260 226,226,249
Heap Start Allocated 1.13 MiB 1.13 MiB
Heap End Allocated 1.13 MiB 1.13 MiB
Heap Delta Allocated 128 B 128 B

Measured on ubuntu-latest x64.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 8, 2026

Benchmark Results

407 benchmarks

Interpreted: 🟢 45 improved · 🔴 75 regressed · 287 unchanged · avg -0.5%
Bytecode: 🟢 20 improved · 🔴 326 regressed · 61 unchanged · avg -5.4%

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

Deterministic profile diff

Deterministic profile diff: no significant changes.

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 May 8, 2026

test262 Conformance

Category Run Passed Δ Pass Failed Pass-rate Δ Rate
built-ins 23,449 14,362 +1 9,086 61.2% ±0pp
harness 116 71 ±0 45 61.2% ±0pp
intl402 3,324 167 ±0 3,157 5.0% ±0pp
language 23,635 12,570 ±0 11,065 53.2% ±0pp
staging 1,483 470 ±0 1,011 31.7% ±0pp
total 52,007 27,640 +1 24,364 53.1% ±0pp

Areas closest to 100%

Area Pass rate Δ vs main Passing
built-ins/WeakSet 98.8% ±0pp 84 / 85
built-ins/WeakMap 98.6% ±0pp 139 / 141
language/asi 97.1% ±0pp 99 / 102
Per-test deltas (+1 / -0)

Newly passing (1):

  • built-ins/Number/prototype/toExponential/undefined-fractiondigits.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.

@frostney frostney marked this pull request as ready for review May 8, 2026 22:46
@coderabbitai coderabbitai Bot added bug Something isn't working documentation Improvements or additions to documentation internal Refactoring, CI, tooling, cleanup labels May 8, 2026
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: 2

🤖 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.

Inline comments:
In `@source/units/Goccia.Values.Iterator.Lazy.pas`:
- Around line 269-307: When FIndex >= FLimit in
TGocciaLazyTakeIteratorValue.DoAdvanceNext and DoDirectNext you must perform
iterator close on FSourceIterator before marking done and returning; update both
methods to call the iterator close routine (e.g. FSourceIterator.Close or the
project’s IteratorClose helper) on FSourceIterator (safely, checking for
assigned if needed), then set FDone and return the same results as before so the
wrapped iterator is properly closed when the take limit is reached.
- Around line 505-510: The code currently calls FSourceIterator.Close directly
before calling ThrowTypeError when ResolveIterator(MappedValue) returns nil,
which can allow a Close exception to overwrite the intended
SErrorIteratorFlatMapMustReturnIterable TypeError; change both occurrences (the
block that sets FInnerIterator after ResolveIterator and the similar block
around lines 559-564) to use the existing CloseIteratorPreservingError helper:
capture the original type error, call
CloseIteratorPreservingError(FSourceIterator, originalError) inside a try/except
pattern used elsewhere in this method, and then re-raise the original type error
via ThrowTypeError(SErrorIteratorFlatMapMustReturnIterable,
SSuggestIteratorFlatMapCallable) so cleanup failures do not replace the flatMap
protocol error.
🪄 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: CHILL

Plan: Pro

Run ID: 31d890f0-38e3-4ffb-9ed8-b3c38862ecec

📥 Commits

Reviewing files that changed from the base of the PR and between f8a0ffd and 7903318.

📒 Files selected for processing (5)
  • docs/value-system.md
  • source/units/Goccia.Values.Iterator.Concat.pas
  • source/units/Goccia.Values.Iterator.Lazy.pas
  • source/units/Goccia.Values.Iterator.Zip.pas
  • source/units/Goccia.Values.IteratorValue.pas

Comment thread source/units/Goccia.Values.Iterator.Lazy.pas
Comment thread source/units/Goccia.Values.Iterator.Lazy.pas
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working documentation Improvements or additions to documentation internal Refactoring, CI, tooling, cleanup

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Engine: centralize FExecuting re-entrancy guard into a TGocciaIteratorHelperValue base class

1 participant