Skip to content

Reject mixed stdout benchmark report formats#340

Merged
frostney merged 1 commit into
mainfrom
t3code/issue-335-implementation
Apr 18, 2026
Merged

Reject mixed stdout benchmark report formats#340
frostney merged 1 commit into
mainfrom
t3code/issue-335-implementation

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Apr 18, 2026

Summary

  • Prevents benchmark runs from writing structured formats (JSON/CSV) and human-readable formats (console/text) to stdout at the same time.
  • Adds an early validation step in GocciaBenchmarkRunner that detects mixed stdout report targets and exits with an error.
  • Prints a clear stderr message telling users to send one report to --output instead.

Fixes #335

- Prevent JSON/CSV and human-readable reports from sharing stdout
- Exit with an error when one of the reports needs an output file
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 18, 2026

📝 Walkthrough

Walkthrough

Added early validation in the benchmark runner to prevent mixed structured and human-readable formats from writing to stdout simultaneously, detecting this conflict before rendering and terminating with an error.

Changes

Cohort / File(s) Summary
Validation Logic
source/app/GocciaBenchmarkRunner.dpr
Added pre-render validation that scans report specifications via two boolean flags to detect conflicts where both structured formats (JSON/CSV) and human-readable formats target stdout (empty OutputFile). Errors to StdErr and exits with code 1 when conflict is detected.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

Suggested labels

bug

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The pull request description is missing required Testing section with checkbox items and lacks documentation updates statement. Add a Testing section with checkboxes for: JavaScript/TypeScript tests, documentation updates, optional Pascal tests, and optional benchmark regression tests as specified in the template.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically describes the main change: rejecting mixed stdout benchmark report formats, which aligns with the core functionality added to prevent simultaneous writing of structured and human-readable formats to stdout.
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 bug Something isn't working label Apr 18, 2026
@github-actions
Copy link
Copy Markdown
Contributor

Benchmark Results

386 benchmarks

Interpreted: 🟢 35 improved · 🔴 270 regressed · 81 unchanged · avg -6.1%
Bytecode: 🟢 85 improved · 🔴 70 regressed · 231 unchanged · avg -0.0%

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

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

@github-actions
Copy link
Copy Markdown
Contributor

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 5679 5679
Tests Passed 5638 ✅ 5679 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 1.20s 1.30s
Tests Lex (cumulative) 182.2ms 114.4ms
Tests Parse (cumulative) 260.2ms 263.3ms
Tests Compile (cumulative) 169.0ms
Tests Execute (cumulative) 1.14s 1.31s
Tests Engine Total (cumulative) 1.58s 1.85s
Tests Lex (avg/worker) 45.6ms 28.6ms
Tests Parse (avg/worker) 65.1ms 65.8ms
Tests Compile (avg/worker) 42.3ms
Tests Execute (avg/worker) 283.9ms 326.9ms
Tests Engine Total (avg/worker) 394.5ms 463.6ms
Benchmarks Total 386 386
Benchmarks Workers 4 4
Benchmarks Duration 3.09min 2.91min

Measured on ubuntu-latest x64.

@frostney frostney merged commit 143d018 into main Apr 18, 2026
10 checks passed
@frostney frostney deleted the t3code/issue-335-implementation branch April 18, 2026 16:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Reject or warn when mixed structured/human-readable formats are both written to stdout

1 participant