Skip to content

Fix for-of continue raising ReferenceError instead of skipping iteration#425

Merged
frostney merged 2 commits intomainfrom
t3code/verify-implement-401
Apr 27, 2026
Merged

Fix for-of continue raising ReferenceError instead of skipping iteration#425
frostney merged 2 commits intomainfrom
t3code/verify-implement-401

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Apr 27, 2026

Summary

Closes #401.

  • continue was completely unimplemented — the lexer treated it as an identifier, so continue; inside a for-of loop produced ReferenceError: Undefined variable: continue
  • Added the full pipeline across 11 source files: keyword constant → token type → lexer registration → control-flow kind (cfkContinue, tag value 3 in the 2-bit tagged-pointer scheme) → AST node → parser rule → evaluator propagation (including through switch) → bytecode compiler (GContinueJumps with pending-finally support for all three loop variants: counted for-of, iterator for-of, for-await-of) → illegal-continue guard in function bodies
  • Registered gttContinue in all five keyword-as-property-name lists so { continue: "v" } keeps working

…ation (#401)

`continue` was completely unimplemented — the lexer treated it as an
identifier, so `continue;` inside a for-of loop produced
"ReferenceError: Undefined variable: continue".

Add the full pipeline: keyword constant, token type, lexer registration,
control-flow kind (cfkContinue, tag value 3 in the 2-bit scheme), AST
node, parser rule, evaluator propagation (including through switch),
bytecode compiler (GContinueJumps with pending-finally support for all
three loop variants), and an illegal-continue guard in function bodies.
Also register gttContinue in all five keyword-as-property-name lists so
`{ continue: "v" }` keeps working.

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

vercel Bot commented Apr 27, 2026

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

Project Deployment Actions Updated (UTC)
gocciascript-homepage Ready Ready Preview, Comment Apr 27, 2026 4:25pm

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 27, 2026

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: e3ab5a5f-4dae-43fa-8171-019e154f9523

📥 Commits

Reviewing files that changed from the base of the PR and between 0b7f5f7 and 9ab9195.

📒 Files selected for processing (2)
  • source/units/Goccia.Compiler.Statements.pas
  • tests/language/for-of/for-of-continue.js

📝 Walkthrough
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically describes the main change: implementing continue to fix the ReferenceError and enable proper iteration skipping in for-of loops.
Description check ✅ Passed The description covers the issue, the comprehensive implementation across the pipeline, property-name handling, and links the related issue #401; all key aspects are documented.
Linked Issues check ✅ Passed The implementation fully addresses issue #401 by making continue a recognized control-flow statement that correctly skips loop iterations, resolving the ReferenceError and producing the expected output.
Out of Scope Changes check ✅ Passed All changes are scoped to implementing the continue statement for for-of loops; no unrelated or out-of-scope modifications are present.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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


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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 27, 2026

Benchmark Results

386 benchmarks

Interpreted: 🟢 8 improved · 🔴 233 regressed · 145 unchanged · avg -3.6%
Bytecode: 🟢 3 improved · 🔴 368 regressed · 15 unchanged · avg -12.6%

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

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 27, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 7973 7973
Tests Passed 7932 ✅ 7973 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 1.91s 1.81s
Tests Lex (cumulative) 216.2ms 126.5ms
Tests Parse (cumulative) 293.3ms 289.5ms
Tests Compile (cumulative) 192.3ms
Tests Execute (cumulative) 1.72s 1.66s
Tests Engine Total (cumulative) 2.23s 2.27s
Tests Lex (avg/worker) 54.1ms 31.6ms
Tests Parse (avg/worker) 73.3ms 72.4ms
Tests Compile (avg/worker) 48.1ms
Tests Execute (avg/worker) 430.1ms 415.5ms
Tests Engine Total (avg/worker) 557.5ms 567.6ms
Benchmarks Total 386 386
Benchmarks Workers 4 4
Benchmarks Duration 3.01min 3.21min

Measured on ubuntu-latest x64.

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 the current code and only fix it if needed.

Inline comments:
In `@source/units/Goccia.Compiler.Statements.pas`:
- Around line 1619-1637: The loop that compiles pending-finally entries for
continue must pop the current Entry from GPendingFinally before compiling its
cleanup and then restore it afterward to avoid reusing the same entry during
nested abrupt completions; modify the block inside the for-loop (where Entry is
assigned and before calling CompileBlockStatement or
EmitDisposalSequence/EmitJumpInstruction/EmitInstruction) to snapshot/remove the
active entry (mirror the snapshot/pop/restore pattern used in
EmitPendingCleanup), call EmitInstruction(ACtx, EncodeABC(OP_POP_HANDLER,...))
and then compile the FinallyBlock or emit disposal sequence, and finally restore
the popped entry back onto GPendingFinally so the stack state matches the
original after the cleanup is emitted.
- Around line 1143-1145: Continue targets are currently patched after the
per-iteration OP_CLOSE_UPVALUE block which lets a continue skip the
upvalue-close; change the patch target so GContinueJumps (and any ContinueJumps
list handling) is set to a label placed immediately before the emitted
OP_CLOSE_UPVALUE sequence and then fall through into the increment/ITER_NEXT
back-edge, and update calls to PatchJumpTarget(ACtx, ContinueJumps[I]) to use
that label position; apply the same adjustment to the other loop-generation
sites (the other ContinueJumps patches referenced) so continues jump to just
before OP_CLOSE_UPVALUE rather than past it.
🪄 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: fe58ebd2-8ce0-4835-afcf-9a42eaa394aa

📥 Commits

Reviewing files that changed from the base of the PR and between c50d178 and 0b7f5f7.

📒 Files selected for processing (12)
  • source/units/Goccia.AST.Statements.pas
  • source/units/Goccia.Compiler.Statements.pas
  • source/units/Goccia.Compiler.pas
  • source/units/Goccia.ControlFlow.pas
  • source/units/Goccia.Error.Messages.pas
  • source/units/Goccia.Evaluator.pas
  • source/units/Goccia.Keywords.Reserved.pas
  • source/units/Goccia.Lexer.pas
  • source/units/Goccia.Parser.pas
  • source/units/Goccia.Token.pas
  • source/units/Goccia.Values.FunctionValue.pas
  • tests/language/for-of/for-of-continue.js
👮 Files not reviewed due to content moderation or server errors (11)
  • source/units/Goccia.Token.pas
  • source/units/Goccia.Error.Messages.pas
  • source/units/Goccia.Lexer.pas
  • source/units/Goccia.Compiler.pas
  • source/units/Goccia.Keywords.Reserved.pas
  • source/units/Goccia.Values.FunctionValue.pas
  • source/units/Goccia.Evaluator.pas
  • source/units/Goccia.AST.Statements.pas
  • source/units/Goccia.Parser.pas
  • source/units/Goccia.ControlFlow.pas
  • tests/language/for-of/for-of-continue.js

Comment thread source/units/Goccia.Compiler.Statements.pas Outdated
Comment thread source/units/Goccia.Compiler.Statements.pas
…ally safety

1. Move continue-jump patch targets to before the OP_CLOSE_UPVALUE
   sequence in all three loop compilers (counted for-of, for-of,
   for-await-of) so that continue falls through the upvalue-closing
   instructions instead of skipping them — preserves correct closure
   semantics for captured loop bindings.

2. Apply the snapshot/pop/restore pattern from EmitPendingCleanup to
   CompileContinueStatement so that pending-finally entries are removed
   before compiling their cleanup blocks, preventing duplicate cleanup
   or infinite recursion when a finally block contains another abrupt
   completion.

3. Add test for closure capture correctness across continue.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@frostney frostney merged commit fb7ccd9 into main Apr 27, 2026
12 checks passed
@frostney frostney deleted the t3code/verify-implement-401 branch April 27, 2026 16:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

for-of: continue raises ReferenceError instead of skipping iteration

1 participant