Skip to content

Refine website landing and sandbox copy#445

Merged
frostney merged 6 commits into
mainfrom
t3code/section-tooltip-updates
Apr 29, 2026
Merged

Refine website landing and sandbox copy#445
frostney merged 6 commits into
mainfrom
t3code/section-tooltip-updates

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Apr 28, 2026

Summary

  • refine landing page visual spacing, feature/runtime copy, tooltips, and responsive source-to-result layout
  • update sandbox copy, preview layout, syntax highlighting, and resizable desktop panes
  • align tool-call comparison with GPT-5 Responses API request bodies and token-count maintenance script

@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 28, 2026

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

Project Deployment Actions Updated (UTC)
gocciascript-homepage Ready Ready Preview, Comment Apr 29, 2026 0:36am

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 28, 2026

Warning

Rate limit exceeded

@frostney has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 2 minutes and 13 seconds before requesting another review.

To keep reviews running without waiting, you can enable usage-based add-on for your organization. This allows additional reviews beyond the hourly cap. Account admins can enable it under billing.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: af97c97c-3c62-4620-944f-00fd030d786e

📥 Commits

Reviewing files that changed from the base of the PR and between 521e004 and e9a42ea.

📒 Files selected for processing (2)
  • website/src/app/globals.css
  • website/src/components/sandbox.tsx
📝 Walkthrough

Walkthrough

Adds GPT token-counting tooling, a shared tool-call-comparison module, validation scripts that compute/verify GPT‑5 (o200k_base) token counts, centralizes sandbox tool-call logic, and introduces a resizable, accessible 3‑pane sandbox UI plus landing/CSS/content tweaks.

Changes

Cohort / File(s) Summary
Token tooling & scripts
website/package.json, website/scripts/compute-llm-call-tokens.ts, website/scripts/compute-llm-call-tokens.mjs
Adds gpt-tokenizer devDependency; new/rewritten scripts compute GPT‑5‑family token counts for Responses API request bodies, print per-step totals, and fail when computed tokens diverge from exported baselines.
Tool-call comparison library
website/src/lib/tool-call-comparison.ts
New module defining tool schemas, two execution flows (bash, goccia), per-step expected calls/results, token baselines, risk annotations, and exported helpers: getInstructions, buildFunctionCallOutput, buildLlmRequest, plus related types/constants.
Sandbox UI & integration
website/src/components/sandbox.tsx
Removes local tool-call/token logic in favor of imports from the new library; updates payload rendering to HighlightedJson/HighlightedShell; implements accessible pointer+keyboard resizable 3‑pane layout with separators; refreshes demo copy and default code/globals.
Landing content & examples
website/src/components/landing.tsx, website/src/lib/landing-data.ts
Updates hero and feature copy with tooltips and compatibility notes; replaces Temporal example with SemVer; adds Import Maps example; minor copy edits and class name tweak (rounded-cardarch-card).
Styling & small component tweaks
website/src/app/globals.css, website/src/components/animated-output.tsx
Large CSS updates (hero spacing, tooltip styles, sandbox grid/resizer, tool-call expand/collapse animations, responsive tweaks); simplifies gutter-symbol conditional in animated output.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant Script as compute-llm-call-tokens
  participant Lib as tool-call-comparison
  participant Tokenizer as gpt-tokenizer
  participant Baseline as LLM_CALL_TOKENS

  Script->>Lib: buildLlmRequest(flowKey, index)
  Script->>Lib: buildFunctionCallOutput(flowKey, index)
  Script->>Tokenizer: encode request/output -> token arrays
  Tokenizer-->>Script: tokens per part (in/out)
  Script->>Script: aggregate computed[flowKey] per-step totals
  Script->>Baseline: compare computed vs exported baselines
  alt mismatch
    Script->>Script: exit non-zero (stale)
  else match
    Script-->>Script: print per-flow step totals
  end
Loading

Estimated Code Review Effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly Related PRs

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description lacks required Testing section with checkboxes and completion status. While it provides a good summary of changes, it does not follow the template structure for verification/testing documentation. Add the Testing section with checkbox items and indicate which verification steps were completed (e.g., checked compute-llm-call-tokens, lint, and build steps).
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 "Refine website landing and sandbox copy" accurately summarizes the main changes, focusing on copy/text refinements which are a significant part of this PR alongside layout and tooling updates.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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


Review rate limit: 0/5 reviews remaining, refill in 2 minutes and 13 seconds.

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 28, 2026

Benchmark Results

392 benchmarks

Interpreted: 🟢 48 improved · 🔴 97 regressed · 247 unchanged · avg +0.3%
Bytecode: 🟢 16 improved · 🔴 323 regressed · 53 unchanged · avg -6.9%

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

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 28, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 8111 8111
Tests Passed 8070 ✅ 8111 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 1.80s 1.40s
Tests Lex (cumulative) 193.9ms 98.5ms
Tests Parse (cumulative) 287.7ms 214.4ms
Tests Compile (cumulative) 138.0ms
Tests Execute (cumulative) 1.88s 1.10s
Tests Engine Total (cumulative) 2.37s 1.55s
Tests Lex (avg/worker) 48.5ms 24.6ms
Tests Parse (avg/worker) 71.9ms 53.6ms
Tests Compile (avg/worker) 34.5ms
Tests Execute (avg/worker) 470.9ms 273.8ms
Tests Engine Total (avg/worker) 591.3ms 386.5ms
Benchmarks Total 392 392
Benchmarks Workers 4 4
Benchmarks Duration 2.50min 2.22min

Measured on ubuntu-latest x64.

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: 2

🧹 Nitpick comments (1)
website/src/components/sandbox.tsx (1)

841-865: Make the new pane resizers operable without a pointer.

These handles are focusable buttons, but they only respond to drag events. Keyboard users can land on them and then get stuck with no way to resize the panes. Adding separator semantics plus ArrowLeft/ArrowRight handling would make the feature usable beyond pointer input.

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

In `@website/src/components/sandbox.tsx` around lines 841 - 865, The new resizer
buttons (class "sb-resizer", aria-labels "Resize script and globals panes" and
"Resize globals and result panes") are focusable but only handle pointer drags
via startPaneResize; add keyboard support and separator semantics so non-pointer
users can resize. Give the controls role="separator" and
aria-orientation="horizontal" (and appropriate
aria-valuenow/aria-valuemin/aria-valuemax if pane sizes are tracked), and add an
onKeyDown handler that listens for ArrowLeft/ArrowRight (and optionally
ArrowUp/ArrowDown) to call the same resize logic (e.g., invoke startPaneResize
with a small step or call the internal resize function) and handle Home/End for
extremes; keep existing onPointerDown behavior intact so pointer and keyboard
both work.
🤖 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/app/globals.css`:
- Around line 2148-2155: The CSS selector .sb-field + .sb-field no longer
matches because .sb-resizer elements are inserted between fields; update the
rules under .sb-demo-body to target the field that follows a resizer or another
field by replacing .sb-field + .sb-field with both .sb-field + .sb-resizer +
.sb-field and .sb-resizer + .sb-field (and mirror this change inside the `@media`
(min-width: 900px) / 3-column override blocks referenced around the other
occurrence), so separators (border-top / border-left) still apply when
.sb-resizer sits between .sb-field elements.
- Around line 1116-1119: The rule limiting .container > .section-head and
.container > .mt-12 > .section-head with max-width: 80vw causes narrower text
blocks on small screens; remove or replace that declaration so these selectors
no longer constrain width (e.g., delete the max-width: 80vw line or set
max-width: none/100%) to allow the section-heads to fill the container naturally
and avoid excessive wrapping.

---

Nitpick comments:
In `@website/src/components/sandbox.tsx`:
- Around line 841-865: The new resizer buttons (class "sb-resizer", aria-labels
"Resize script and globals panes" and "Resize globals and result panes") are
focusable but only handle pointer drags via startPaneResize; add keyboard
support and separator semantics so non-pointer users can resize. Give the
controls role="separator" and aria-orientation="horizontal" (and appropriate
aria-valuenow/aria-valuemin/aria-valuemax if pane sizes are tracked), and add an
onKeyDown handler that listens for ArrowLeft/ArrowRight (and optionally
ArrowUp/ArrowDown) to call the same resize logic (e.g., invoke startPaneResize
with a small step or call the internal resize function) and handle Home/End for
extremes; keep existing onPointerDown behavior intact so pointer and keyboard
both work.
🪄 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: 07223070-7b35-4ace-9c0e-30ef7563bb45

📥 Commits

Reviewing files that changed from the base of the PR and between 82c82c7 and d763710.

⛔ Files ignored due to path filters (1)
  • website/bun.lock is excluded by !**/*.lock
📒 Files selected for processing (7)
  • website/package.json
  • website/scripts/compute-llm-call-tokens.mjs
  • website/src/app/globals.css
  • website/src/components/animated-output.tsx
  • website/src/components/landing.tsx
  • website/src/components/sandbox.tsx
  • website/src/lib/landing-data.ts

Comment thread website/src/app/globals.css Outdated
Comment thread website/src/app/globals.css Outdated
@coderabbitai coderabbitai Bot added documentation Improvements or additions to documentation internal Refactoring, CI, tooling, cleanup labels Apr 29, 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.

🧹 Nitpick comments (1)
website/src/components/sandbox.tsx (1)

493-532: Consider cleaning up event listeners on unmount.

The pointermove and pointerup listeners attached to window won't be cleaned up if the component unmounts mid-drag. This is unlikely in practice but could cause errors if it occurs.

♻️ Suggested fix using useEffect cleanup

One approach is to track active listeners in a ref and clean them up on unmount:

+ const cleanupRef = useRef<(() => void) | null>(null);
+
+ useEffect(() => {
+   return () => cleanupRef.current?.();
+ }, []);

  const startPaneResize = useCallback(
    (handleIndex: 0 | 1) => (event: React.PointerEvent<HTMLButtonElement>) => {
      // ... existing code ...
      const up = () => {
        window.removeEventListener("pointermove", move);
        window.removeEventListener("pointerup", up);
+       cleanupRef.current = null;
      };
+     cleanupRef.current = up;
      window.addEventListener("pointermove", move);
      window.addEventListener("pointerup", up, { once: true });
    },
    [paneCols],
  );
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@website/src/components/sandbox.tsx` around lines 493 - 532, The
startPaneResize handler attaches window listeners (pointermove and pointerup)
that aren't removed if the component unmounts mid-drag; add a cleanup to ensure
removal by storing the active move and up callbacks in a ref (e.g., a ref named
activeDragRef) when you call window.addEventListener inside startPaneResize, and
add a useEffect with a cleanup that checks activeDragRef and removes those
listeners (window.removeEventListener("pointermove", move) and
window.removeEventListener("pointerup", up)) on unmount; ensure you still call
event.currentTarget.setPointerCapture and keep the existing once option for
pointerup but also clear listeners from the ref in the up handler so the cleanup
knows there’s nothing to remove.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@website/src/components/sandbox.tsx`:
- Around line 493-532: The startPaneResize handler attaches window listeners
(pointermove and pointerup) that aren't removed if the component unmounts
mid-drag; add a cleanup to ensure removal by storing the active move and up
callbacks in a ref (e.g., a ref named activeDragRef) when you call
window.addEventListener inside startPaneResize, and add a useEffect with a
cleanup that checks activeDragRef and removes those listeners
(window.removeEventListener("pointermove", move) and
window.removeEventListener("pointerup", up)) on unmount; ensure you still call
event.currentTarget.setPointerCapture and keep the existing once option for
pointerup but also clear listeners from the ref in the up handler so the cleanup
knows there’s nothing to remove.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: c9689226-a054-4db5-8f7d-31f49221432c

📥 Commits

Reviewing files that changed from the base of the PR and between d763710 and 5fdbb77.

📒 Files selected for processing (4)
  • website/scripts/compute-llm-call-tokens.mjs
  • website/src/components/sandbox.tsx
  • website/src/lib/tool-call-comparison.d.mts
  • website/src/lib/tool-call-comparison.mjs
✅ Files skipped from review due to trivial changes (1)
  • website/src/lib/tool-call-comparison.d.mts
🚧 Files skipped from review as they are similar to previous changes (1)
  • website/scripts/compute-llm-call-tokens.mjs

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
website/src/components/sandbox.tsx (1)

728-746: Consider using role="separator" for the resizer elements.

The <hr> elements with aria-orientation, aria-valuemin/max/now follow the ARIA slider pattern, but splitter/resizer controls are typically marked with role="separator" (when focusable) per the WAI-ARIA spec. This isn't blocking, but adding role="separator" would make the intent clearer to assistive technologies.

💡 Optional: Add explicit separator role
 <hr
   className="sb-resizer"
+  role="separator"
   tabIndex={0}
   aria-orientation="horizontal"

Also applies to: 760-778

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

In `@website/src/components/sandbox.tsx` around lines 728 - 746, Add an explicit
ARIA role to the resizer element to reflect it's a focusable separator: update
the <hr> that uses className "sb-resizer" (the element wired to
startPaneResize(0) and handlePaneResizeKeyDown(0), and using MIN_PANE_SIZE and
paneCols to compute aria-valuemin/valuemax/valuenow) to include
role="separator". Do the same change for the other symmetric resizer instance
(the one around lines 760-778) so assistive tech recognizes the control as a
separator while preserving the existing aria-* attributes and event handlers.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@website/src/components/sandbox.tsx`:
- Around line 728-746: Add an explicit ARIA role to the resizer element to
reflect it's a focusable separator: update the <hr> that uses className
"sb-resizer" (the element wired to startPaneResize(0) and
handlePaneResizeKeyDown(0), and using MIN_PANE_SIZE and paneCols to compute
aria-valuemin/valuemax/valuenow) to include role="separator". Do the same change
for the other symmetric resizer instance (the one around lines 760-778) so
assistive tech recognizes the control as a separator while preserving the
existing aria-* attributes and event handlers.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2de8252f-300d-4b6a-8dd6-47af3b33f89b

📥 Commits

Reviewing files that changed from the base of the PR and between a5f9ec2 and 521e004.

📒 Files selected for processing (2)
  • website/src/app/globals.css
  • website/src/components/sandbox.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

🧹 Nitpick comments (1)
website/src/app/globals.css (1)

2625-2628: Keep an explicit focus ring on the splitter.

The separator is now keyboard-resizable in website/src/components/sandbox.tsx, but this rule removes the outline on :focus-visible. On a 7px handle, the background tint alone is easy to miss. Keep a real focus indicator here instead of zeroing it out.

💡 Suggested tweak
   .sb-resizer:hover,
   .sb-resizer:focus-visible {
     background: color-mix(in oklab, var(--accent) 22%, var(--paper-2));
-    outline: 0;
+  }
+  .sb-resizer:focus-visible {
+    outline: 2px solid var(--accent);
+    outline-offset: -1px;
   }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@website/src/app/globals.css` around lines 2625 - 2628, The focus-visible rule
for the splitter (.sb-resizer:focus-visible) removes the outline which hides
keyboard focus on the small 7px handle; instead of setting outline: 0, restore a
visible focus indicator — update the .sb-resizer:focus-visible selector to
remove the outline: 0 and apply an explicit, accessible focus style (for example
an outline or focus ring using outline or box-shadow with a high-contrast color
variable like --accent or a dedicated --focus variable) so keyboard users can
clearly see the splitter is focused while preserving the existing hover styling
in .sb-resizer:hover.
🤖 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/sandbox.tsx`:
- Around line 543-573: The pointermove listener isn't removed if the gesture is
canceled or pointer capture is lost; capture the element and pointerId from the
initial event (e.g., const el = event.currentTarget as HTMLElement; const pid =
event.pointerId), then update the teardown to remove pointermove and pointerup
and also remove pointercancel and lostpointercapture listeners and call
el.releasePointerCapture(pid) during cleanup; add
window.addEventListener("pointercancel", cleanup) and
el.addEventListener("lostpointercapture", cleanup) (or similar) to ensure move
and up handlers created in the sandbox.tsx resize code (the move, up functions
and the resizePanePair call sites) are always detached.

---

Nitpick comments:
In `@website/src/app/globals.css`:
- Around line 2625-2628: The focus-visible rule for the splitter
(.sb-resizer:focus-visible) removes the outline which hides keyboard focus on
the small 7px handle; instead of setting outline: 0, restore a visible focus
indicator — update the .sb-resizer:focus-visible selector to remove the outline:
0 and apply an explicit, accessible focus style (for example an outline or focus
ring using outline or box-shadow with a high-contrast color variable like
--accent or a dedicated --focus variable) so keyboard users can clearly see the
splitter is focused while preserving the existing hover styling in
.sb-resizer:hover.
🪄 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: cddf44cb-6e7b-441e-ada4-d5b7bd9ed6b4

📥 Commits

Reviewing files that changed from the base of the PR and between 521e004 and e52b3e6.

📒 Files selected for processing (2)
  • website/src/app/globals.css
  • website/src/components/sandbox.tsx

Comment thread website/src/components/sandbox.tsx Outdated
@frostney frostney merged commit 1b8cae8 into main Apr 29, 2026
12 checks passed
@frostney frostney deleted the t3code/section-tooltip-updates branch April 29, 2026 00:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation internal Refactoring, CI, tooling, cleanup new feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant