Skip to content

Update website API execution endpoints#444

Merged
frostney merged 1 commit into
mainfrom
t3code/api-execute-test-endpoints
Apr 28, 2026
Merged

Update website API execution endpoints#444
frostney merged 1 commit into
mainfrom
t3code/api-execute-test-endpoints

Conversation

@frostney
Copy link
Copy Markdown
Owner

Summary

  • Rename the website execution API from /api/run to /api/execute and update callers, tracing, and deploy config.
  • Add /api/test, backed by GocciaTestRunner, with the same request limits, rate limiting, spawn handling, telemetry, and output caps as execution.
  • Move shared route mechanics into a server helper and sanitize temporary test file paths in API responses.

Testing

  • bunx biome check next.config.ts vercel.ts scripts/fetch-nightly-binary.mjs src/app/api/execute/route.ts src/app/api/test/route.ts src/components/landing.tsx src/components/playground.tsx src/components/sandbox.tsx src/lib/goccia-api.ts src/lib/posthog-server.ts
  • bunx tsc --noEmit
  • bun test
  • ./build.pas loader testrunner
  • SKIP_VENDOR_FETCH=1 bun run build
  • Local HTTP smoke checks for /api/execute and /api/test

@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 28, 2026 9:06pm

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 28, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 7bfad67b-aaf5-44d6-9cb7-7b8151062776

📥 Commits

Reviewing files that changed from the base of the PR and between 741ebd5 and 1a99735.

📒 Files selected for processing (11)
  • website/next.config.ts
  • website/scripts/fetch-nightly-binary.mjs
  • website/src/app/api/execute/route.ts
  • website/src/app/api/run/route.ts
  • website/src/app/api/test/route.ts
  • website/src/components/landing.tsx
  • website/src/components/playground.tsx
  • website/src/components/sandbox.tsx
  • website/src/lib/goccia-api.ts
  • website/src/lib/posthog-server.ts
  • website/vercel.ts
💤 Files with no reviewable changes (1)
  • website/src/app/api/run/route.ts

📝 Walkthrough

Walkthrough

This PR refactors the API request handling by replacing the /api/run endpoint with two new endpoints: /api/execute for code execution and /api/test for test execution. Core handler logic is extracted into a shared library, and references are updated across configuration, route handlers, and client components.

Changes

Cohort / File(s) Summary
API Route Definitions
website/src/app/api/execute/route.ts, website/src/app/api/test/route.ts
New API route handlers for execute and test operations, each delegating to shared request handler functions with nodejs runtime and force-dynamic configuration.
Shared Request Handlers
website/src/lib/goccia-api.ts
New library module implementing handleExecuteRequest() and handleTestRequest() functions. Provides shared logic for request validation, binary resolution, process spawning, timeout/abort handling, output truncation, rate limiting, and structured response formatting.
Deleted Endpoint
website/src/app/api/run/route.ts
Complete removal of previous /api/run endpoint handler (~517 lines), including rate limiting, request validation, binary spawning, and response formatting logic now consolidated in shared handlers.
Configuration Updates
website/next.config.ts, website/vercel.ts
Updated output file tracing and Vercel function configuration to reference new /api/execute and /api/test routes instead of /api/run, maintaining memory and duration limits.
Client Updates
website/src/components/landing.tsx, website/src/components/playground.tsx, website/src/components/sandbox.tsx
Updated POST request endpoints from /api/run to /api/execute across landing page, playground, and sandbox components with corresponding comment/documentation updates.
Documentation Updates
website/scripts/fetch-nightly-binary.mjs, website/src/lib/posthog-server.ts
Updated inline comments and module descriptions to reference new /api/execute and /api/test endpoints instead of /api/run; no runtime logic changes.

Sequence Diagram

sequenceDiagram
    participant Client
    participant Execute as /api/execute Route
    participant Handler as goccia-api Handler
    participant Loader as Loader Binary
    participant Env as Environment

    Client->>Execute: POST request with code
    Execute->>Handler: handleExecuteRequest(req)
    Handler->>Handler: Validate & parse JSON payload
    Handler->>Handler: Check code size limits
    Handler->>Env: Resolve loader binary path
    Handler->>Loader: Spawn process with code via stdin
    Loader->>Loader: Execute code
    Loader-->>Handler: Return stdout/stderr
    Handler->>Handler: Truncate output if needed
    Handler->>Handler: Capture PostHog events
    Handler-->>Execute: Return structured JSON response
    Execute-->>Client: Send response with results
Loading

Estimated Code Review Effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested labels

new feature, internal

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 9.68% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: renaming the API execution endpoints and adding new route handlers.
Description check ✅ Passed The description follows the template structure with a clear summary and testing section, covering implementation details and verification steps.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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


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

@coderabbitai coderabbitai Bot added new feature New feature or request internal Refactoring, CI, tooling, cleanup labels Apr 28, 2026
@github-actions
Copy link
Copy Markdown
Contributor

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 8056 8056
Tests Passed 8015 ✅ 8056 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 1.80s 1.91s
Tests Lex (cumulative) 207.6ms 136.5ms
Tests Parse (cumulative) 313.1ms 328.7ms
Tests Compile (cumulative) 199.2ms
Tests Execute (cumulative) 1.48s 1.67s
Tests Engine Total (cumulative) 2.00s 2.33s
Tests Lex (avg/worker) 51.9ms 34.1ms
Tests Parse (avg/worker) 78.3ms 82.2ms
Tests Compile (avg/worker) 49.8ms
Tests Execute (avg/worker) 370.0ms 416.9ms
Tests Engine Total (avg/worker) 500.2ms 583.0ms
Benchmarks Total 386 386
Benchmarks Workers 4 4
Benchmarks Duration 3.11min 2.89min

Measured on ubuntu-latest x64.

@github-actions
Copy link
Copy Markdown
Contributor

Benchmark Results

386 benchmarks

Interpreted: 🟢 40 improved · 🔴 54 regressed · 292 unchanged · avg -0.1%
Bytecode: 🟢 14 improved · 🔴 337 regressed · 35 unchanged · avg -7.7%

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

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

@frostney frostney merged commit 876bd3f into main Apr 28, 2026
12 checks passed
@frostney frostney deleted the t3code/api-execute-test-endpoints branch April 28, 2026 21:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant