Skip to content

Fix changelog website grouping#459

Merged
frostney merged 1 commit into
mainfrom
t3code/website-changelog-fix
Apr 29, 2026
Merged

Fix changelog website grouping#459
frostney merged 1 commit into
mainfrom
t3code/website-changelog-fix

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Apr 29, 2026

Summary

  • group commits touching website/ into a dedicated changelog Website section
  • restrict git-cliff release sections to semver-style tags so nightly is ignored
  • exempt generated CHANGELOG.md from the markdown document length checker

@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 29, 2026

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

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

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 29, 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: 7a662978-e1c8-4f29-8a28-0aec7e9d2be8

📥 Commits

Reviewing files that changed from the base of the PR and between 23695ab and 3873a80.

📒 Files selected for processing (4)
  • CHANGELOG.md
  • cliff.toml
  • docs/build-system.md
  • scripts/check-doc-length.ts
✅ Files skipped from review due to trivial changes (1)
  • docs/build-system.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • cliff.toml

📝 Walkthrough

Walkthrough

Reorganizes the 0.7.0 changelog into a dedicated "🌐 Website" subsection, updates git-cliff configuration to detect and label commits touching website/ (and strip the Website: prefix), documents the behavior, and exempts CHANGELOG.md from the markdown line-length checker.

Changes

Cohort / File(s) Summary
Changelog
CHANGELOG.md
Reorganized 0.7.0 entries: removed website entries from other categories and added a consolidated ### 🌐 Website subsection containing all website-scoped items.
git-cliff config
cliff.toml
Add preprocessing to detect changed website/ paths and prefix commits with Website: for grouping; strip that prefix from displayed commit lines; restrict tag discovery to semver-style tags; skip merge commits consistently.
Docs
docs/build-system.md
Document the new website changelog category, path-based detection behavior, and semver-only tag discovery for release notes.
Build scripts
scripts/check-doc-length.ts
Exclude CHANGELOG.md from markdown line-count enforcement, normalize paths to forward slashes, and report exempt vs checked file counts with --verbose logging.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested labels

documentation, internal

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Description check ❓ Inconclusive The description provides a clear summary of changes but does not include the required Testing section with verification checkboxes as specified in the template. Add the Testing section with checkboxes to document how the changes were verified, even if some items are marked optional or N/A.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and directly summarizes the main objective of the PR: organizing commits touching the website/ directory into a dedicated changelog section.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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


Review rate limit: 1/5 review remaining, refill in 47 minutes and 12 seconds.

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

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
scripts/check-doc-length.ts (1)

95-120: Consider reporting checked vs exempt counts explicitly.

The summary currently prints discovered files, not evaluated files. With exemptions, this can be slightly misleading in CI logs.

♻️ Suggested tweak
 const main = (): void => {
   const files = findMarkdownFiles(ROOT);
   let failures = 0;
+  let checkedCount = 0;
+  let skippedCount = 0;
   const results: { file: string; lines: number; limit: number }[] = [];

   for (const file of files) {
     const rel = relative(ROOT, file).split("\\").join("/");
     if (EXEMPT_FILES.has(rel)) {
+      skippedCount++;
       if (VERBOSE) {
         console.log(`  SKIP  ${rel}: exempt from doc length limit`);
       }
       continue;
     }
+    checkedCount++;

     const content = readFileSync(file, "utf-8");
@@
-  console.log(`\nChecked ${files.length} files, default limit ${DEFAULT_LIMIT} lines.`);
+  console.log(`\nChecked ${checkedCount} files (${skippedCount} exempt), default limit ${DEFAULT_LIMIT} lines.`);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/check-doc-length.ts` around lines 95 - 120, Update the final
reporting to show how many files were evaluated versus exempted: count exempted
files when you skip (EXEMPT_FILES check) and compute evaluatedCount =
files.length - exemptCount (or track evaluated when you increment
failures/results), then replace the current summary console.log with one that
prints total discovered files, exempt count, evaluated/checked count, and the
default limit (use the existing variables files.length, EXEMPT_FILES logic,
failures/results where helpful) so CI logs clearly show checked vs exempt
counts.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@scripts/check-doc-length.ts`:
- Around line 95-120: Update the final reporting to show how many files were
evaluated versus exempted: count exempted files when you skip (EXEMPT_FILES
check) and compute evaluatedCount = files.length - exemptCount (or track
evaluated when you increment failures/results), then replace the current summary
console.log with one that prints total discovered files, exempt count,
evaluated/checked count, and the default limit (use the existing variables
files.length, EXEMPT_FILES logic, failures/results where helpful) so CI logs
clearly show checked vs exempt counts.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 96bd0dcc-8351-4b30-8a08-de6d4f61e11a

📥 Commits

Reviewing files that changed from the base of the PR and between 00cf386 and 23695ab.

📒 Files selected for processing (4)
  • CHANGELOG.md
  • cliff.toml
  • docs/build-system.md
  • scripts/check-doc-length.ts

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 29, 2026

Benchmark Results

407 benchmarks

Interpreted: 🟢 19 improved · 🔴 174 regressed · 214 unchanged · avg -0.7%
Bytecode: 🟢 41 improved · 🔴 94 regressed · 272 unchanged · avg +0.2%

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

github-actions Bot commented Apr 29, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 8269 8269
Tests Passed 8228 ✅ 8269 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 1.81s 1.40s
Tests Lex (cumulative) 203.1ms 96.0ms
Tests Parse (cumulative) 304.8ms 222.8ms
Tests Compile (cumulative) 150.6ms
Tests Execute (cumulative) 1.51s 1.30s
Tests Engine Total (cumulative) 2.02s 1.77s
Tests Lex (avg/worker) 50.8ms 24.0ms
Tests Parse (avg/worker) 76.2ms 55.7ms
Tests Compile (avg/worker) 37.7ms
Tests Execute (avg/worker) 378.0ms 325.6ms
Tests Engine Total (avg/worker) 505.0ms 443.0ms
Benchmarks Total 407 407
Benchmarks Workers 4 4
Benchmarks Duration 2.42min 2.35min

Measured on ubuntu-latest x64.

@frostney frostney force-pushed the t3code/website-changelog-fix branch from 23695ab to 3873a80 Compare April 29, 2026 16:23
@coderabbitai coderabbitai Bot added documentation Improvements or additions to documentation internal Refactoring, CI, tooling, cleanup labels Apr 29, 2026
@frostney frostney merged commit d9b5e52 into main Apr 29, 2026
12 checks passed
@frostney frostney deleted the t3code/website-changelog-fix branch April 29, 2026 16:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation internal Refactoring, CI, tooling, cleanup

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant