Skip to content

Fix decorator wrapper this-binding test gap and misdirecting warning#416

Merged
frostney merged 1 commit into
mainfrom
t3code/verify-issue-405
Apr 27, 2026
Merged

Fix decorator wrapper this-binding test gap and misdirecting warning#416
frostney merged 1 commit into
mainfrom
t3code/verify-issue-405

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Apr 27, 2026

Summary

Closes #405.

  • Tests: fix "decorator can replace method" to use an honest arrow wrapper (this-independent method), add "wrapper preserves call-site this" and "wrapper supports recursive self-call" using object-method shorthand
  • Docs: add "Writing wrappers" subsection to Decorators in language.md showing the object-method-shorthand pattern and why arrows/function expressions are unsuitable for this-capturing wrappers
  • Warning: update all four function/async-function parser warnings to suggest object-method shorthand alongside arrow functions, instead of recommending only arrows (which lose call-site this)

…405)

Tests: fix "decorator can replace method" to use an honest arrow wrapper
(this-independent method), add "wrapper preserves call-site this" and
"wrapper supports recursive self-call" using object-method shorthand.

Docs: add "Writing wrappers" subsection to Decorators in language.md
showing the object-method-shorthand pattern and why arrows/function
expressions are unsuitable for this-capturing wrappers.

Warning: update all four function/async-function parser warnings to
suggest object-method shorthand alongside arrow functions, instead of
recommending only arrows (which lose call-site this).

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 11:04am

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 27, 2026

📝 Walkthrough

Walkthrough

Updates documentation, parser warnings, and test coverage to address decorator wrapper issues with call-site this binding. Introduces object-method shorthand as the recommended pattern for preserving this in decorator wrappers and adds test cases for recursive calls and instance state access in decorated methods.

Changes

Cohort / File(s) Summary
Documentation
docs/language.md
Adds new subsection under Decorators explaining how to wrap decorators while preserving call-site this. Explicitly warns that arrow functions won't work due to lexical this capture. Provides object-method shorthand wrapper example using context.name as computed property key. Updates function-keyword warning suggestion to include method shorthand pattern for this-binding cases.
Parser Warnings
source/units/Goccia.Parser.pas
Updates warning suggestion text in parser when function/async function constructs are disabled. Changes guidance from simple "use arrow functions" to explicit method-shorthand patterns (({ name(...) {} }).name) for cases requiring call-site this binding.
Test Coverage
tests/language/decorators/basic-method-decorator.js
Modifies existing decorator test and adds two new test cases. New tests verify: (1) wrapper preserves call-site this via method.apply(this, args) and allows wrapped method to access instance state, and (2) recursive self-calls within decorated methods execute through the wrapper correctly. All wrapper examples use object-method shorthand.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title directly addresses the main changes: fixing a decorator wrapper this-binding test gap and correcting a misdirecting parser warning about function expressions.
Linked Issues check ✅ Passed All four objectives from issue #405 are addressed: test coverage for this-preserving wrappers and recursion, documentation of object-method-shorthand idiom, parser warning updates suggesting correct patterns, and comprehensive testing reported.
Out of Scope Changes check ✅ Passed All changes are directly scoped to issue #405: test updates for decorator this-binding, documentation additions for wrapper idioms, and parser warning revisions—no unrelated modifications detected.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description check ✅ Passed The PR description clearly describes the changes across tests, docs, and warnings, and directly references the closed issue (#405).

✏️ 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

Benchmark Results

386 benchmarks

Interpreted: 🟢 62 improved · 🔴 85 regressed · 239 unchanged · avg -0.5%
Bytecode: 🟢 313 improved · 🔴 23 regressed · 50 unchanged · avg +7.5%

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

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

@github-actions
Copy link
Copy Markdown
Contributor

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 7872 7872
Tests Passed 7831 ✅ 7872 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 1.30s 1.91s
Tests Lex (cumulative) 146.8ms 129.6ms
Tests Parse (cumulative) 215.6ms 297.4ms
Tests Compile (cumulative) 197.1ms
Tests Execute (cumulative) 1.05s 1.68s
Tests Engine Total (cumulative) 1.41s 2.30s
Tests Lex (avg/worker) 36.7ms 32.4ms
Tests Parse (avg/worker) 53.9ms 74.3ms
Tests Compile (avg/worker) 49.3ms
Tests Execute (avg/worker) 262.8ms 419.3ms
Tests Engine Total (avg/worker) 353.4ms 575.3ms
Benchmarks Total 386 386
Benchmarks Workers 4 4
Benchmarks Duration 2.97min 2.96min

Measured on ubuntu-latest x64.

@frostney frostney merged commit 2d53bbc into main Apr 27, 2026
12 checks passed
@frostney frostney deleted the t3code/verify-issue-405 branch April 27, 2026 11:19
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.

Decorator wrappers silently lose call-site this; tests don't cover it; warning misdirects

1 participant