Skip to content

Fix website labels, hero console alignment, and example file extensions#423

Merged
frostney merged 2 commits into
mainfrom
t3code/website-hero-installation-fixes
Apr 27, 2026
Merged

Fix website labels, hero console alignment, and example file extensions#423
frostney merged 2 commits into
mainfrom
t3code/website-hero-installation-fixes

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Apr 27, 2026

Summary

  • Fix hero console output growing from center instead of top (justify-content: flex-start)
  • Rename "Install" to "Installation" in nav tab, page metadata, and section kicker breadcrumb
  • Rename hero code tab from coffee-shop.js to coffee-typed.ts (matching the playground link)
  • Add per-example ext field so typed examples (types, enums, coffee-typed) display .ts in the playground

- Update installation page and nav copy to use "Installation"
- Show example file extensions in the playground and hero
- Adjust hero layout and example metadata for typed samples
@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 27, 2026

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

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

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 27, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 028d164a-0a2a-4086-a802-e58d20aacb86

📥 Commits

Reviewing files that changed from the base of the PR and between 38afe22 and f645a68.

📒 Files selected for processing (2)
  • website/src/app/installation/page.tsx
  • website/src/lib/examples.ts
✅ Files skipped from review due to trivial changes (2)
  • website/src/lib/examples.ts
  • website/src/app/installation/page.tsx

📝 Walkthrough

Walkthrough

Renames "Install" to "Installation" across UI and metadata, adds an optional ext field to example definitions and updates examples to .ts, changes playground/landing to display example file extensions dynamically, and adjusts .hero-console alignment from centered to top-aligned.

Changes

Cohort / File(s) Summary
Install Label Terminology
website/src/app/installation/page.tsx, website/src/components/install.tsx, website/src/components/site-shell.tsx
Renamed page title and UI labels from "Install" to "Installation" and synchronized Open Graph/Twitter titles.
Example File Extensions
website/src/lib/examples.ts, website/src/components/landing.tsx, website/src/components/playground.tsx
Added optional `ext?: "js"
Hero Console Styling
website/src/app/globals.css
Changed .hero-console flex justify-content from center to flex-start to top-align hero content.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description covers the main changes with bullet points but lacks the required Testing section with checkboxes and verification items specified in the template. Add a Testing section with checkboxes for: end-to-end test verification, documentation updates, optional benchmark/native test verifications, and specific test steps for hero console, nav labels, file extensions, and playground display.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the three main changes: hero console alignment fix, website label updates (Install→Installation), and example file extension additions.
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.


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

@coderabbitai coderabbitai Bot added the internal Refactoring, CI, tooling, cleanup label Apr 27, 2026
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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
website/src/app/installation/page.tsx (1)

7-23: ⚠️ Potential issue | 🟠 Major

Fix inconsistent social/OG titles (“Install” vs “Installation”).

metadata.title is updated to "Installation", but both openGraph.title and twitter.title remain "Install · GocciaScript". This will produce inconsistent titles in social previews and potentially for bots/SEO.

Suggested patch
 export const metadata: Metadata = {
   title: "Installation",
   description:
     "Install GocciaScript — one-line installer, prebuilt binaries, or build from source. Single self-contained runtime, no Node.js required.",
   alternates: { canonical: "/installation" },
   openGraph: {
-    title: "Install · GocciaScript",
+    title: "Installation · GocciaScript",
     description:
       "Install GocciaScript — one-line installer, prebuilt binaries, or build from source.",
     url: "/installation",
   },
   twitter: {
-    title: "Install · GocciaScript",
+    title: "Installation · GocciaScript",
     description:
       "Install GocciaScript — one-line installer, prebuilt binaries, or build from source.",
   },
 };
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@website/src/app/installation/page.tsx` around lines 7 - 23, The metadata
object has inconsistent titles: metadata.title is "Installation" while
openGraph.title and twitter.title are "Install · GocciaScript"; update
openGraph.title and twitter.title to match metadata.title (e.g., "Installation ·
GocciaScript" or simply "Installation") so social/OG and Twitter previews are
consistent; change the values in the metadata.openGraph.title and
metadata.twitter.title properties to the same canonical title used in
metadata.title.
🧹 Nitpick comments (3)
website/src/components/playground.tsx (1)

382-389: Good: render filename suffix via example.ext with fallback.

The updated header ({example.id}.{example.ext ?? "js"}) is correct given the new Example.ext?: string field and preserves backward compatibility for examples without ext.

Optional: if you want extra safety against misconfigured empty strings, consider example.ext?.trim() || "js" instead of nullish-only fallback.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@website/src/components/playground.tsx` around lines 382 - 389, The header
rendering currently uses {example.id}.{example.ext ?? "js"} which is fine; to
guard against empty-string ext values, change the fallback to use a trimmed
truthy check: treat example.ext trimmed as the extension or fall back to "js".
Update the expression where the header is rendered (referencing example.id and
example.ext) so it uses the trimmed-or-default logic (e.g., check
example.ext?.trim() and default to "js").
website/src/lib/examples.ts (1)

6-12: Clarify/guard the ext contract (expected format).

Example.ext is currently string, and the playground renders it as example.id.{example.ext ?? "js"} (so it assumes ext is something like "ts" / "js" without a leading dot). If ext ever becomes "" or ".ts" by mistake, the UI could show coffee-typed. or coffee-typed..ts.

Consider either:

  • constraining the type (e.g., union of allowed extensions), or
  • documenting/normalizing (e.g., ensure no leading . and non-empty).
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@website/src/lib/examples.ts` around lines 6 - 12, Example.ext's contract is
unclear: the UI expects a non-empty extension without a leading dot (rendered as
example.id.{example.ext ?? "js"}), so guard/normalize it; either change the
Example type to a union of allowed values (e.g., "js" | "ts" | "jsx" | "tsx") to
enforce valid extensions, or keep ext as string but ensure normalization where
examples are created or consumed (strip any leading '.' and default
empty/undefined to "js") — update references to Example.ext and the rendering
logic that builds example.id.{...} to use the normalized/validated value.
website/src/components/landing.tsx (1)

196-206: LGTM — hero header now shows coffee-typed.ts consistently.

The rendered filename suffix in the hero card is updated to the .ts form and should visually match what the playground expects for example=coffee-typed.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@website/src/components/landing.tsx` around lines 196 - 206, The hero header
now correctly displays "coffee-typed.ts" in the JSX span inside the code-card
(look for the span with className "flex-1" in the component return block) so no
code change is needed; approve the change, but if you want to be explicit ensure
the source string used for the filename is exactly "coffee-typed.ts" wherever it
is derived (the JSX span and any mapping that reads example=coffee-typed) so the
playground and UI remain consistent.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@website/src/app/installation/page.tsx`:
- Around line 7-23: The metadata object has inconsistent titles: metadata.title
is "Installation" while openGraph.title and twitter.title are "Install ·
GocciaScript"; update openGraph.title and twitter.title to match metadata.title
(e.g., "Installation · GocciaScript" or simply "Installation") so social/OG and
Twitter previews are consistent; change the values in the
metadata.openGraph.title and metadata.twitter.title properties to the same
canonical title used in metadata.title.

---

Nitpick comments:
In `@website/src/components/landing.tsx`:
- Around line 196-206: The hero header now correctly displays "coffee-typed.ts"
in the JSX span inside the code-card (look for the span with className "flex-1"
in the component return block) so no code change is needed; approve the change,
but if you want to be explicit ensure the source string used for the filename is
exactly "coffee-typed.ts" wherever it is derived (the JSX span and any mapping
that reads example=coffee-typed) so the playground and UI remain consistent.

In `@website/src/components/playground.tsx`:
- Around line 382-389: The header rendering currently uses
{example.id}.{example.ext ?? "js"} which is fine; to guard against empty-string
ext values, change the fallback to use a trimmed truthy check: treat example.ext
trimmed as the extension or fall back to "js". Update the expression where the
header is rendered (referencing example.id and example.ext) so it uses the
trimmed-or-default logic (e.g., check example.ext?.trim() and default to "js").

In `@website/src/lib/examples.ts`:
- Around line 6-12: Example.ext's contract is unclear: the UI expects a
non-empty extension without a leading dot (rendered as example.id.{example.ext
?? "js"}), so guard/normalize it; either change the Example type to a union of
allowed values (e.g., "js" | "ts" | "jsx" | "tsx") to enforce valid extensions,
or keep ext as string but ensure normalization where examples are created or
consumed (strip any leading '.' and default empty/undefined to "js") — update
references to Example.ext and the rendering logic that builds example.id.{...}
to use the normalized/validated value.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: fa6828bd-3a83-4603-a777-2843ee7a252d

📥 Commits

Reviewing files that changed from the base of the PR and between f6b3e67 and 38afe22.

📒 Files selected for processing (7)
  • website/src/app/globals.css
  • website/src/app/installation/page.tsx
  • website/src/components/install.tsx
  • website/src/components/landing.tsx
  • website/src/components/playground.tsx
  • website/src/components/site-shell.tsx
  • website/src/lib/examples.ts

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 27, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 7962 7962
Tests Passed 7921 ✅ 7962 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 1.91s 1.70s
Tests Lex (cumulative) 207.9ms 128.7ms
Tests Parse (cumulative) 302.8ms 296.1ms
Tests Compile (cumulative) 187.0ms
Tests Execute (cumulative) 1.59s 1.38s
Tests Engine Total (cumulative) 2.10s 1.99s
Tests Lex (avg/worker) 52.0ms 32.2ms
Tests Parse (avg/worker) 75.7ms 74.0ms
Tests Compile (avg/worker) 46.7ms
Tests Execute (avg/worker) 396.5ms 344.9ms
Tests Engine Total (avg/worker) 524.2ms 497.8ms
Benchmarks Total 386 386
Benchmarks Workers 4 4
Benchmarks Duration 2.91min 2.80min

Measured on ubuntu-latest x64.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 27, 2026

Benchmark Results

386 benchmarks

Interpreted: 🟢 14 improved · 🔴 347 regressed · 25 unchanged · avg -7.2%
Bytecode: 🟢 40 improved · 🔴 103 regressed · 243 unchanged · avg -2.1%

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

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.

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

Labels

internal Refactoring, CI, tooling, cleanup

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant