Skip to content

Add version dispatch to playground engine#467

Merged
frostney merged 2 commits into
mainfrom
t3code/version-switcher-fetch
Apr 29, 2026
Merged

Add version dispatch to playground engine#467
frostney merged 2 commits into
mainfrom
t3code/version-switcher-fetch

Conversation

@frostney
Copy link
Copy Markdown
Owner

Summary

  • Playground dropdown now dispatches each request to the matching engine binary instead of always running nightly. The selection rides along to /api/execute and /api/test as a version field; the API resolves it against vendor/manifest.json and short-circuits with a 400 UNKNOWN_VERSION for tags it didn't vendor.
  • prebuild script (scripts/fetch-binaries.ts, replacing fetch-nightly-binary.mjs) downloads nightly plus the top three pickPrecedenceVersions picks into vendor/<tag>/. Pre-0.7.0 archives preserve their original binary names (ScriptLoader/TestRunner); 0.7.0+ keep the Goccia* prefix. SHA-256 digests cache cross-build re-runs.
  • A --help / no-args fallback probe records each binary's supported long-option flags in the manifest. The API filters sandbox flags (--max-memory, --max-instructions, --stack-size, --allowed-host) against the probed set so older engines silently drop unknown options and still execute. User-toggled compat flags (--compat-var, --compat-function) pass through unconditionally — the engine's own "Unknown option" error surfaces, so opting in against a version that doesn't support it is visible.
  • Today's vendored set: 0.7.0, 0.6.1, 0.5.1, nightly (~34 MB total under vendor/, comfortably below Vercel's function-size ceiling). The set re-balances automatically as future stable releases land.

Test plan

  • bun test — 122 pass, 6 new for isFlagSupported
  • bun run lint — clean
  • bun run buildvendor/manifest.json written with all 4 entries + per-binary feature lists
  • curl /api/execute -d '{"code":"console.log(1+1)","version":"0.7.0"}'{"ok":true,"output":"2\n"}
  • curl /api/execute -d '{"code":"console.log(1+1)","version":"0.6.1"}' → executes (was failing on --max-memory before)
  • curl /api/execute -d '{"code":"var x=1","version":"0.6.1","compatVar":true}' → engine surfaces Unknown option "--compat-var" in rawStdout (deliberate)
  • curl /api/execute -d '{"version":"v999.0.0",...}' → 400 UNKNOWN_VERSION
  • curl /api/test -d '{"version":"0.6.1",...}' → legacy test runner executes, {passed:1,totalTests:1}
  • Vercel preview renders the dropdown with v0.7.0 · latest, v0.6.1, v0.5.1, nightly
  • Switching in the preview deploy confirms the API actually swaps the binary

🤖 Generated with Claude Code

Picking a version in the playground dropdown now actually runs against
that release. The prebuild script vendors nightly plus the top three
precedence picks under vendor/<tag>/ (preserving each archive's original
binary names), and the API dispatches per request against the resulting
manifest. A per-binary --help probe captures which long-option flags
each engine accepts, so older versions silently drop modern sandbox
flags (--max-memory, --max-instructions, --stack-size, --allowed-host)
instead of erroring on first unknown-option. User-toggled compat flags
(--compat-var, --compat-function) are passed unconditionally so the
engine's own error surfaces when the version doesn't support them.

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

vercel Bot commented Apr 29, 2026

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

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

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 29, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 9442ff1c-9597-4e45-9351-efceea180b8f

📥 Commits

Reviewing files that changed from the base of the PR and between 8a1a988 and 966d49e.

📒 Files selected for processing (4)
  • website/scripts/fetch-binaries.ts
  • website/src/__tests__/vendor-manifest.test.ts
  • website/src/lib/goccia-api.ts
  • website/src/lib/vendor-manifest.ts
✅ Files skipped from review due to trivial changes (1)
  • website/src/tests/vendor-manifest.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • website/scripts/fetch-binaries.ts

📝 Walkthrough

Walkthrough

Replaces single-nightly vendoring with a Bun/TypeScript prebuild that vendors multiple engine releases and produces a vendor manifest; runtime and playground now resolve engine versions and supported flags from that manifest instead of probing GitHub or local fixed paths.

Changes

Cohort / File(s) Summary
Build-time vendoring & npm script
website/package.json, website/scripts/fetch-binaries.ts
Replaces prebuild step to call bun scripts/fetch-binaries.ts. Adds a Bun/TS fetcher that vendors nightly plus stable tags, extracts platform-specific binaries, probes supported flags, and emits vendor/manifest.json.
Removed legacy fetcher
website/scripts/fetch-nightly-binary.mjs
Deleted single-nightly fetch script (replaced by new fetch-binaries.ts).
Vendor manifest model & utilities
website/src/lib/vendor-manifest.ts, website/src/lib/vendor-manifest-server.ts
Adds types (VendorManifest, VendorEntry, VendorFeatureSet), normalization, isFlagSupported, findVersion, listPlaygroundVersions, and server-side getVendorManifest() with caching and test cache reset.
Playground page & component
website/src/app/playground/page.tsx, website/src/components/playground.tsx
Page now reads manifest via getVendorManifest() and passes versions + defaultVersion to Playground. Component props changed (removed stableTags, added versions and defaultVersion), canonicalizes/matches versions (ignoring v prefix), and displays versions with v prefix except nightly.
API input schema & validation
website/src/lib/goccia-tool-schema.ts, website/src/__tests__/goccia-tool-schema.test.ts
Adds optional version?: string with MAX_VERSION_BYTES=64 to Zod and JSON schema; tests updated/added to validate version handling and envelope sizing.
API runtime resolution & feature-aware argv
website/src/lib/goccia-api.ts
Engine path resolution now uses getVendorManifest() + findVersion() (dev-local fallback). Returns UNKNOWN_VERSION for unresolved versions in production. Constructs engine argv conditionally using isFlagSupported per-kind; telemetry includes resolved version.
Semver utilities exported
website/src/lib/github.ts
Exports Semver type and parseSemverTag function so other modules can canonicalize/match semver tags.
Tests for manifest utilities
website/src/__tests__/vendor-manifest.test.ts
Adds comprehensive tests covering findVersion, isFlagSupported, legacy path handling, and listPlaygroundVersions ordering and edge cases.

Sequence Diagram(s)

sequenceDiagram
    actor BuildProcess as Build Process
    participant FetchBinaries as fetch-binaries.ts
    participant GitHub as GitHub API
    participant Manifest as vendor/manifest.json

    BuildProcess->>FetchBinaries: Run prebuild (bun scripts/fetch-binaries.ts)
    FetchBinaries->>GitHub: Query releases/tags & download release archives
    GitHub-->>FetchBinaries: Release archives + metadata
    FetchBinaries->>FetchBinaries: Extract platform binaries, probe --help flags
    FetchBinaries->>Manifest: Write/update vendor/manifest.json (versions + features)
    Manifest-->>FetchBinaries: manifest written
Loading
sequenceDiagram
    actor User as User
    participant Page as playground/page.tsx
    participant ManifestServer as getVendorManifest()
    participant Component as Playground
    participant API as goccia-api.ts
    participant VendorManifest as vendor/manifest.json

    User->>Page: Load playground
    Page->>ManifestServer: getVendorManifest()
    ManifestServer-->>Page: VendorManifest (versions + defaultVersion)
    Page->>Component: Render with versions, defaultVersion
    User->>Component: Select/version + submit
    Component->>API: POST /goccia (includes version)
    API->>VendorManifest: findVersion(requestedVersion)
    VendorManifest-->>API: VendorEntry (path, features)
    API->>API: isFlagSupported(...) per flag -> build argv
    API-->>Component: Execution result
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 40.00% 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 'Add version dispatch to playground engine' directly and clearly summarizes the main objective: enabling playground requests to dispatch to selected engine binary versions instead of always using nightly.
Description check ✅ Passed The PR description is comprehensive, covering the change summary, implementation details, current vendored set, and a detailed test plan with status indicators. It addresses all key aspects of the changeset and aligns with template expectations.
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: 3/5 reviews remaining, refill in 23 minutes and 24 seconds.

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 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/lib/goccia-api.ts (1)

750-751: Variable shadowing: resolved declared twice in nested scopes.

The outer resolved (line 728) holds the binary resolution result, while the inner resolved (line 751) tracks promise callback state. This works but can cause confusion during maintenance.

Consider renaming the inner variable for clarity
   return await new Promise<Response>((resolve) => {
-    let resolved = false;
+    let finished = false;
     let cleaned = false;
     // ...
     const finish = (res: Response) => {
-      if (resolved) return;
-      resolved = true;
+      if (finished) return;
+      finished = true;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@website/src/lib/goccia-api.ts` around lines 750 - 751, The outer variable
named resolved (the binary resolution flag) is being shadowed by another
resolved declared inside the new Promise executor; rename the inner
promise-state flag (for example to promiseResolved or callbackResolved) used in
the Promise returned by the function so it no longer shadows the outer resolved,
and update all references inside the Promise (the executor closure and any
places that set/check that flag) to use the new name.
🤖 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/lib/goccia-api.ts`:
- Around line 750-751: The outer variable named resolved (the binary resolution
flag) is being shadowed by another resolved declared inside the new Promise
executor; rename the inner promise-state flag (for example to promiseResolved or
callbackResolved) used in the Promise returned by the function so it no longer
shadows the outer resolved, and update all references inside the Promise (the
executor closure and any places that set/check that flag) to use the new name.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 730917d9-1a22-4fd8-a063-0c24db121ac1

📥 Commits

Reviewing files that changed from the base of the PR and between 19375d5 and 8a1a988.

📒 Files selected for processing (12)
  • website/package.json
  • website/scripts/fetch-binaries.ts
  • website/scripts/fetch-nightly-binary.mjs
  • website/src/__tests__/goccia-tool-schema.test.ts
  • website/src/__tests__/vendor-manifest.test.ts
  • website/src/app/playground/page.tsx
  • website/src/components/playground.tsx
  • website/src/lib/github.ts
  • website/src/lib/goccia-api.ts
  • website/src/lib/goccia-tool-schema.ts
  • website/src/lib/vendor-manifest-server.ts
  • website/src/lib/vendor-manifest.ts
💤 Files with no reviewable changes (1)
  • website/scripts/fetch-nightly-binary.mjs

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 29, 2026

Benchmark Results

407 benchmarks

Interpreted: 🟢 355 improved · 🔴 7 regressed · 45 unchanged · avg +9.7%
Bytecode: 🟢 61 improved · 🔴 200 regressed · 146 unchanged · avg -2.1%

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

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 29, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 8279 8279
Tests Passed 8238 ✅ 8279 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 1.40s 1.90s
Tests Lex (cumulative) 158.2ms 136.3ms
Tests Parse (cumulative) 251.1ms 356.4ms
Tests Compile (cumulative) 215.0ms
Tests Execute (cumulative) 1.19s 1.49s
Tests Engine Total (cumulative) 1.60s 2.20s
Tests Lex (avg/worker) 39.6ms 34.1ms
Tests Parse (avg/worker) 62.8ms 89.1ms
Tests Compile (avg/worker) 53.7ms
Tests Execute (avg/worker) 296.6ms 373.1ms
Tests Engine Total (avg/worker) 399.0ms 550.0ms
Benchmarks Total 407 407
Benchmarks Workers 4 4
Benchmarks Duration 2.50min 2.36min

Measured on ubuntu-latest x64.

Two follow-ups on the version-dispatch PR:

- The build script now sets `manifest.defaultVersion` to the first stable
  pick (`versions[0]` after newest-first sorting) instead of `nightly`, so
  the playground dropdown opens on the latest release and unspecified API
  requests run against it. Fallback to `nightly` only when no stable was
  vendored.
- Renamed the inner `let resolved = false` flag in `runHandler`'s Promise
  executor to `responseSent` so it stops shadowing the outer
  `const resolved = resolveBinaryPath(...)`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@frostney frostney merged commit ce0c237 into main Apr 29, 2026
12 checks passed
@frostney frostney deleted the t3code/version-switcher-fetch branch April 29, 2026 22:14
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