Skip to content

Close source iterator when take limit is reached (#591)#593

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

Close source iterator when take limit is reached (#591)#593
frostney merged 2 commits into
mainfrom
t3code/issue-591

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented May 9, 2026

Summary

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

New tests added

Test What it verifies
take closes the source when the limit is reached Source iterator marked done after take exhaustion
take closes source iterator when limit is reached .return() called on custom iterator when take limit hit
take runs generator finally blocks when limit is reached Generator finally block executes on take exhaustion
take does not close source when source is exhausted before limit No spurious close when source ends naturally
take(0) closes source iterator immediately Zero-limit case closes immediately
take propagates errors from return() on normal completion TypeError from .return() propagates per ES2024 §7.4.10

Full suite

8955/8960 pass (5 pre-existing FFI library loading failures, unrelated).

…591)

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

vercel Bot commented May 9, 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 Preview May 9, 2026 6:27pm

Request Review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 9, 2026

Review Change Stack
No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 0602f359-4e81-454d-ab90-ccacd42555fd

📥 Commits

Reviewing files that changed from the base of the PR and between 28f16a2 and 3b34b74.

📒 Files selected for processing (2)
  • source/units/Goccia.Values.Iterator.Lazy.pas
  • tests/built-ins/Iterator/prototype/take.js
🚧 Files skipped from review as they are similar to previous changes (2)
  • source/units/Goccia.Values.Iterator.Lazy.pas
  • tests/built-ins/Iterator/prototype/take.js

📝 Walkthrough

Walkthrough

TGocciaLazyTakeIteratorValue now closes its source iterator via CloseIterator(FSourceIterator) when the take limit is reached in both DoAdvanceNext and DoDirectNext. Tests were updated and added to verify closure behavior (return() called / closed flag), generator finally execution, non-closure when the source exhausts early, immediate closure for take(0), and propagation of return() errors.

Changes

Iterator Take Source Closure

Layer / File(s) Summary
Core Implementation
source/units/Goccia.Values.Iterator.Lazy.pas
DoAdvanceNext and DoDirectNext now call CloseIterator(FSourceIterator) when the take limit is reached, then set done and return the final done/undefined result.
Test Coverage
tests/built-ins/Iterator/prototype/take.js
Updated an existing test and added tests verifying: the source iterator is closed on limit reach (subsequent source.next() is done), return() is invoked (closed flag), generator finally blocks run, the source is not closed when it exhausts before the limit, take(0) closes immediately, and errors from the source iterator's return() propagate.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically describes the main change: closing the source iterator when the take limit is reached, with reference to issue #591.
Description check ✅ Passed The description includes all required template sections: clear summary of the change, reference to the issue closed (#591), and comprehensive testing checklist with multiple new test cases documented.
Linked Issues check ✅ Passed The PR fully implements the requirements from issue #591: closes the source iterator in both DoAdvanceNext and DoDirectNext, adds comprehensive tests for close behavior including generator finally blocks, and maintains proper error propagation semantics.
Out of Scope Changes check ✅ Passed All code changes are directly scoped to issue #591: modifications to TGocciaLazyTakeIteratorValue and tests for the take iterator close behavior, with no extraneous changes detected.
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 9, 2026

Benchmark Results

407 benchmarks

Interpreted: 🟢 9 improved · 🔴 367 regressed · 31 unchanged · avg -8.5%
Bytecode: 🟢 113 improved · 🔴 43 regressed · 251 unchanged · avg +1.6%

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

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 9, 2026

Suite Timing

Test Runner (interpreted: 8,994 passed; bytecode: 8,994 passed)
Metric Interpreted Bytecode
Total 8994 8994
Passed 8994 ✅ 8994 ✅
Workers 4 4
Test Duration 1.90s 2.00s
Lex (cumulative) 249.9ms 167.1ms
Parse (cumulative) 260.7ms 269.4ms
Compile (cumulative) 550.6ms
Execute (cumulative) 1.89s 1.65s
Engine Total (cumulative) 2.40s 2.64s
Lex (avg/worker) 62.5ms 41.8ms
Parse (avg/worker) 65.2ms 67.3ms
Compile (avg/worker) 137.6ms
Execute (avg/worker) 472.9ms 412.6ms
Engine Total (avg/worker) 600.5ms 659.4ms

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.58 MiB 223.10 MiB
GC Peak Live 228.59 MiB 223.10 MiB
GC Allocated During Run 232.41 MiB 226.91 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.57min 2.40min

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 111.69 MiB 90.09 MiB
GC Allocated During Run 14.36 GiB 10.53 GiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 2,828 2,653
GC Collected Objects 270,592,860 251,237,759
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 9, 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 9, 2026 10:18
@coderabbitai coderabbitai Bot added bug Something isn't working spec compliance Mismatch against official JavaScript/TypeScript specification internal Refactoring, CI, tooling, cleanup labels May 9, 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: 1

🤖 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 273-277: The normal completion path uses
CloseIteratorPreservingError which can suppress an iterator.return() exception;
replace calls to CloseIteratorPreservingError with CloseIterator when closing
after normal exhaustion in the lazy iterator (the branch that sets FDone := True
and returns CreateIteratorResult(...)) so that iterator.return() exceptions are
allowed to replace the final { done: true } result; update the same change for
the other normal-completion block handling FIndex/FLimit (also affecting the
code paths around FSourceIterator, FDone, CreateIteratorResult).
🪄 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: fe224075-4249-4907-890f-4df4123be5ec

📥 Commits

Reviewing files that changed from the base of the PR and between 2e2ace3 and 28f16a2.

📒 Files selected for processing (2)
  • source/units/Goccia.Values.Iterator.Lazy.pas
  • tests/built-ins/Iterator/prototype/take.js

Comment thread source/units/Goccia.Values.Iterator.Lazy.pas
CloseIteratorPreservingError swallows errors from iter.return(), but take
exhaustion is a normal completion — errors should propagate per ES2024
§7.4.10. Switch to CloseIterator and add a test verifying TypeError
propagation. Also rename existing test to encode close semantics in name.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@frostney frostney merged commit 417dd99 into main May 9, 2026
14 checks passed
@frostney frostney deleted the t3code/issue-591 branch May 9, 2026 19:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working internal Refactoring, CI, tooling, cleanup spec compliance Mismatch against official JavaScript/TypeScript specification

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Iterator.prototype.take must IteratorClose the underlying iterator when the limit is reached

1 participant