Skip to content

Unify website console output with shared ConsolePanel#418

Merged
frostney merged 3 commits into
mainfrom
t3code/common-console-output
Apr 27, 2026
Merged

Unify website console output with shared ConsolePanel#418
frostney merged 3 commits into
mainfrom
t3code/common-console-output

Conversation

@frostney
Copy link
Copy Markdown
Owner

Summary

  • Introduce a shared ConsolePanel component with a zsh/spaceship-style terminal look (--console-bg darker background, inset shadow) used consistently across the hero, playground, sandbox, and compiler pipeline
  • Rework AnimatedOutput with prompt in the gutter, typewriter reveal on the command line with inline caret, and clean empty state (➜ ▊ press Run or ⌘+Enter)
  • Add optional lineNumbers prop to HighlightedTextarea with scroll-synced gutter; enable for both sandbox editors
  • Add GocciaScript system prompt to sandbox buildScript (no eval, no var, no function, no loose equality)
  • Hero auto-runs on mount; footer brand + tagline on one line; format-error skips <stdin> location line; compiler pipeline artifacts use sharp corners and .esm.mjs

Test plan

  • Verify hero console shows typewriter command, output, exit code on page load
  • Verify playground empty state shows ➜ ▊ press Run or ⌘+Enter, transitions smoothly on run
  • Verify sandbox editors have line numbers, host result uses ConsolePanel
  • Verify compiler pipeline Result tab shows command + output + exit in console tab, JSON in JSON tab
  • Verify footer brand + tagline renders on one line
  • Check both cream and espresso themes for console background contrast

🤖 Generated with Claude Code

Introduce a common ConsolePanel wrapper and zsh/spaceship-style
terminal appearance across every console output on the site (hero,
playground, sandbox, compiler pipeline). Key changes:

- New ConsolePanel component with --console-bg darker background
- AnimatedOutput: ➜ prompt in gutter, typewriter reveal on command
  line, inline caret during typing, trailing caret after output
- HighlightedTextarea: optional lineNumbers prop with scroll-synced
  gutter (used by sandbox script/globals editors)
- Sandbox: system prompt header in buildScript, GocciaScriptLoader
  banners, removed --memory arg and caps line
- Landing hero: auto-runs on mount, 5-line padded output
- Footer: brand + tagline on one line
- format-error: skip <stdin> location line entirely
- Compiler pipeline: sharp artifact boxes, .esm → .mjs

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 27, 2026

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

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

@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: d2148b3b-cbd4-4f36-9529-24d6df8538b6

📥 Commits

Reviewing files that changed from the base of the PR and between 03b7ab3 and e679abc.

📒 Files selected for processing (1)
  • website/src/components/animated-output.tsx

📝 Walkthrough

Walkthrough

Adds a theme-aware console style and a new ConsolePanel wrapper; AnimatedOutput treats the first meta line as a typed command (removes emptyState prop), HighlightedTextarea supports optional synchronized line numbers, several pages adopt the console wrapper/behavior, and error formatting reduces default location output.

Changes

Cohort / File(s) Summary
Theme & Styling
website/src/app/globals.css
Adds --console-bg, creates .console-panel, introduces command/typewriter and caret animations (.anim-output-*), .anim-output-hint, adjusts numbered-code gutter sizing, .footer-brand-row, .hero-console/.arch-console refactors, and textarea/gutter layout/radius changes.
Console Wrapper
website/src/components/console-panel.tsx
New exported ConsolePanel component that wraps children in a div.console-panel and accepts an optional className.
Animated Output
website/src/components/animated-output.tsx
Treats the first meta line as a typed “command” row with gutter, typewriter/caret behavior; subsequent lines’ reveal delays offset by the command duration; removes exported prop emptyState?: ReactNode (signature change).
Highlighted Textarea
website/src/components/highlighted-textarea.tsx
Adds optional lineNumbers?: boolean, computes/generates a gutter (1..N) rendered in a <pre>, synchronizes gutter scroll with the editor, and restructures markup (.hta-gutter, .hta-editor).
Pages / Integrations
website/src/components/landing.tsx, website/src/components/playground.tsx, website/src/components/sandbox.tsx
Replace inlined console markup with ConsolePanel + AnimatedOutput; hero auto-executes on mount and drops leading "› " from run banner meta; sandbox enables line numbers and prepends GOCCIA_SYSTEM_PROMPT to built scripts; banner/meta adjustments.
Site Shell / Footer
website/src/components/site-shell.tsx
Footer brand section now uses footer-brand-row; shortens/desizes the descriptive <small> text and adjusts classes.
Error Formatting
website/src/lib/format-error.ts
Stops defaulting missing fileName to "<stdin>"; only emits location meta when a non-"<stdin>" fileName is present.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: introducing a shared ConsolePanel component to unify console output across multiple parts of the website.
Description check ✅ Passed The description comprehensively covers the changes, key implementation details, and provides a detailed test plan matching the template structure.
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 new feature New feature or request internal Refactoring, CI, tooling, cleanup labels 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.

Actionable comments posted: 1

🧹 Nitpick comments (1)
website/src/components/animated-output.tsx (1)

12-15: Verify CSS animation timing stays in sync with JS constants.

The TYPEWRITER_MS = 600 constant here must match the CSS typewriter-expand animation duration and the caret-typing-hide delay in globals.css. Currently both are set to 0.6s, but if either changes independently, the caret handoff will break.

Consider adding a comment noting this coupling, or extracting the timing to a shared location (CSS custom property read via getComputedStyle or a shared config).

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

In `@website/src/components/animated-output.tsx` around lines 12 - 15, The
TYPEWRITER_MS constant in animated-output.tsx is tightly coupled to the CSS
animation duration (typewriter-expand) and the caret-typing-hide delay in
globals.css, so ensure they stay in sync: either add a clear comment next to
TYPEWRITER_MS and STAGGER_MS noting they must match the CSS timings, or refactor
to source the timing from a single place (e.g., define a CSS custom property
used by both globals.css and read via getComputedStyle in the AnimatedOutput
component, or move the timing into a shared JS/TS config that both the component
and your CSS build can consume); update the AnimatedOutput code paths that use
TYPEWRITER_MS and the CSS to use the shared value so the caret handoff remains
correct.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@website/src/components/landing.tsx`:
- Around line 149-152: The comment and the padding loop disagree: the comment
says "Pad to 7 lines" but the while loop pads until lines.length < 5; update
them to match by either changing the comment to "Pad to 5 lines so the hero
console keeps a fixed height." or adjusting the loop condition to lines.length <
7 to preserve the 7-line contract; locate the while loop that pushes { kind:
"meta", text: "" } into the lines array and make the comment and the loop's
numeric target consistent.

---

Nitpick comments:
In `@website/src/components/animated-output.tsx`:
- Around line 12-15: The TYPEWRITER_MS constant in animated-output.tsx is
tightly coupled to the CSS animation duration (typewriter-expand) and the
caret-typing-hide delay in globals.css, so ensure they stay in sync: either add
a clear comment next to TYPEWRITER_MS and STAGGER_MS noting they must match the
CSS timings, or refactor to source the timing from a single place (e.g., define
a CSS custom property used by both globals.css and read via getComputedStyle in
the AnimatedOutput component, or move the timing into a shared JS/TS config that
both the component and your CSS build can consume); update the AnimatedOutput
code paths that use TYPEWRITER_MS and the CSS to use the shared value so the
caret handoff remains correct.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 172efdfd-8d2d-4938-8247-04ee074e2250

📥 Commits

Reviewing files that changed from the base of the PR and between 56c22b8 and 385b264.

📒 Files selected for processing (9)
  • website/src/app/globals.css
  • website/src/components/animated-output.tsx
  • website/src/components/console-panel.tsx
  • website/src/components/highlighted-textarea.tsx
  • website/src/components/landing.tsx
  • website/src/components/playground.tsx
  • website/src/components/sandbox.tsx
  • website/src/components/site-shell.tsx
  • website/src/lib/format-error.ts

Comment thread website/src/components/landing.tsx Outdated
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 27, 2026

Benchmark Results

386 benchmarks

Interpreted: 🟢 253 improved · 🔴 21 regressed · 112 unchanged · avg +5.5%
Bytecode: 🟢 38 improved · 🔴 303 regressed · 45 unchanged · avg -5.1%

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

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 7921 7921
Tests Passed 7880 ✅ 7921 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 1.91s 1.90s
Tests Lex (cumulative) 211.1ms 125.2ms
Tests Parse (cumulative) 306.9ms 297.5ms
Tests Compile (cumulative) 198.1ms
Tests Execute (cumulative) 1.67s 1.86s
Tests Engine Total (cumulative) 2.19s 2.48s
Tests Lex (avg/worker) 52.8ms 31.3ms
Tests Parse (avg/worker) 76.7ms 74.4ms
Tests Compile (avg/worker) 49.5ms
Tests Execute (avg/worker) 417.6ms 464.6ms
Tests Engine Total (avg/worker) 547.1ms 619.8ms
Benchmarks Total 386 386
Benchmarks Workers 4 4
Benchmarks Duration 2.83min 2.86min

Measured on ubuntu-latest x64.

…pling

- landing.tsx: comment said "Pad to 7 lines" but loop pads to 5; fixed
  comment to match the code
- animated-output.tsx: TYPEWRITER_MS and STAGGER_MS are coupled to CSS
  animation durations in globals.css; added sync comment noting the
  matching values (typewriter-expand 0.6s, caret-typing-hide 0.6s)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Comment thread website/src/components/animated-output.tsx
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.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@website/src/components/animated-output.tsx`:
- Around line 50-63: The empty-state hint is hidden from assistive tech; in the
AnimatedOutput component remove the aria-hidden="true" from the <span
className="anim-output-hint"> (do not change the caret span with
className="anim-output-caret" which should remain aria-hidden) and make the hint
announceable by adding aria-live="polite" (and optionally role="status") to that
same hint span or to the wrapping container so screen readers will announce
"press Run or ⌘+Enter" when the empty state is present.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: ce151600-fbef-46e3-8d40-c4da967f6002

📥 Commits

Reviewing files that changed from the base of the PR and between 385b264 and 03b7ab3.

📒 Files selected for processing (2)
  • website/src/components/animated-output.tsx
  • website/src/components/landing.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
  • website/src/components/landing.tsx

Comment thread website/src/components/animated-output.tsx
Remove aria-hidden from the hint span and add role="status" so
assistive tech announces "press Run or ⌘+Enter" when the console
is empty. The decorative caret span remains aria-hidden.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

internal Refactoring, CI, tooling, cleanup new feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant