Skip to content

Fix ArrayBuffer length conversion to use ConstructorToIndex#316

Merged
frostney merged 1 commit into
mainfrom
t3code/fix-issue-311
Apr 16, 2026
Merged

Fix ArrayBuffer length conversion to use ConstructorToIndex#316
frostney merged 1 commit into
mainfrom
t3code/fix-issue-311

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Apr 16, 2026

Summary

  • Replace the manual ToNumberLiteral validation in ArrayBufferConstructorFn with ConstructorToIndex.
  • Align ArrayBuffer(length[, options]) length handling with the shared constructor index conversion path.
  • Remove redundant NaN, infinity, negative, and integer checks from the ArrayBuffer constructor implementation.

Fixes #311

- Replace custom numeric validation with shared constructor index conversion
- Align ArrayBuffer length handling with other constructors
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 16, 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: 60456dfa-8f1f-4b53-8737-6b81fcd08b3e

📥 Commits

Reviewing files that changed from the base of the PR and between 5daf610 and 40e8299.

📒 Files selected for processing (1)
  • units/Goccia.Builtins.GlobalArrayBuffer.pas

📝 Walkthrough

Walkthrough

Refactored ArrayBuffer constructor's length parameter validation by replacing inline parsing and error-checking logic with a centralized ConstructorToIndex function call. This consolidates numeric conversion, NaN/Infinity handling, and bounds validation into a single helper function.

Changes

Cohort / File(s) Summary
ArrayBuffer Constructor Refactoring
units/Goccia.Builtins.GlobalArrayBuffer.pas
Replaced inline length validation (ToNumberLiteral conversion, NaN/Infinity checks, sign and range validation) with centralized ConstructorToIndex helper function. ConstructorToIndex returns 0 for nil/undefined, converts via ToNumberLiteral, treats NaN as 0, throws RangeError for Infinity and out-of-bounds values.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related issues

Possibly related PRs

Suggested labels

spec compliance

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically summarizes the main change: refactoring ArrayBuffer length conversion to use a shared ConstructorToIndex function for consistency.
Description check ✅ Passed The description covers the key changes and links to the related issue (#311), but lacks explicit testing section completion with checkboxes as specified in the template.
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.

@coderabbitai coderabbitai Bot added the spec compliance Mismatch against official JavaScript/TypeScript specification label Apr 16, 2026
@github-actions
Copy link
Copy Markdown
Contributor

Benchmark Results

364 benchmarks

Interpreted: 🟢 80 improved · 🔴 142 regressed · 142 unchanged · avg +0.3%
Bytecode: 🟢 232 improved · 🔴 31 regressed · 101 unchanged · avg +4.8%

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

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 5358 5358
Tests Passed 5317 ✅ 5358 ✅
Tests Skipped 41 0
Tests Test Duration 940.7ms 789.4ms
Tests Lex 233.0ms 145.5ms
Tests Parse 244.8ms 227.6ms
Tests Compile 148.5ms
Tests Execute 973.8ms 854.6ms
Tests Engine Total 1.45s 1.38s
Benchmarks Total 364 364
Benchmarks Duration 8.37min 8.13min

Measured on ubuntu-latest x64.

@frostney frostney merged commit 34157b8 into main Apr 16, 2026
10 checks passed
@frostney frostney deleted the t3code/fix-issue-311 branch April 16, 2026 16:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

spec compliance Mismatch against official JavaScript/TypeScript specification

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Refactor ArrayBufferConstructorFn to use ConstructorToIndex for length coercion

1 participant