Skip to content

fix(website): patch Next.js and Mermaid advisories#789

Merged
frostney merged 1 commit into
mainfrom
claude/quirky-bell-002c23
Jun 24, 2026
Merged

fix(website): patch Next.js and Mermaid advisories#789
frostney merged 1 commit into
mainfrom
claude/quirky-bell-002c23

Conversation

@frostney

Copy link
Copy Markdown
Owner

Summary

  • Bump vulnerable website dependency pins to patched releases and refresh website/bun.lock, clearing the direct-dependency Next.js and Mermaid advisories reported by bun audit.
    • next 16.2.416.2.9 (exact pin preserved, matching the react/react-dom exact pins)
    • mermaid ^11.14.0^11.15.0 (caret floor raised so the minimum-safe version is explicit and self-documenting)
  • Advisories cleared: Next.js GHSA-8h8q-6873-q5fj, GHSA-26hh-7cqf-hhc6 and the rest of the >=16.0.0 <16.2.5 set; Mermaid GHSA-ghcm-xqfw-q4vr, GHSA-xcj9-5m2h-648r, GHSA-87f9-hvmw-gh4p, GHSA-6m6c-36f7-fhxh. bun audit total: 43 → 26, with next (direct dependency) and mermaid (direct dependency) blocks gone.
  • Out of scope (non-goal): the remaining 26 advisories are all transitive (dompurify, postcss←next, protobufjs/@opentelemetry←posthog-js, undici←@vercel/blob, uuid←mermaid). Per the issue's "do not broaden" directive they are left for separate work.
  • Security posture preserved: MermaidBlock's securityLevel: "strict" deny-by-default config is unchanged — website/src/components/mermaid-block.tsx was not modified. The production boundary stays explicit: Vercel deployment, App Router routes, the /api/execute + /api/test functions, and docs-sourced diagrams.
  • Lockfile note: Mermaid 11.15.0 restructures its parser subtree (@mermaid-js/parser 1.1.0→1.1.1 swaps langium for @chevrotain/types ~11.1.1, adds es-toolkit), so the lockfile net shrinks; no unrelated dependency trees were touched.

Closes #784

Testing

  • Verified no regressions and confirmed the new feature or bugfix in end-to-end JavaScript/TypeScript tests
  • Updated documentation
  • Optional: Verified no regressions and confirmed the new feature or bugfix in native Pascal tests (if AST, scope, evaluator, or value types changed)
  • Optional: Verified no benchmark regressions or confirmed benchmark coverage for the change

Commands run (all green, from website/):

  • bun install --frozen-lockfile — lockfile ↔ package.json consistent
  • bun audit — both direct next/mermaid advisory blocks gone (43 → 26 transitive remaining)
  • bun run lint (biome) — clean, 104 files
  • bun test157 pass / 0 fail
  • bun run build (next build) — succeeds, 39 routes incl. /docs/[id] Mermaid pages, /playground, /sandbox

Documentation: none required — routine internal patch bump. The Mermaid security boundary is documented in the preserved mermaid-block.tsx comments and in this PR (consistent with ADRs being reserved for engine/language decisions).

DoD note: the engine gates (./build.pas testrunner, ./format.pas --check) are N/A — zero Pascal/engine files changed; the website's biome + bun toolchain is the applicable gate and is green.

Bump pinned/locked website dependencies to patched releases and refresh
the lockfile, clearing the direct-dependency Next.js and Mermaid security
advisories reported by `bun audit` (43 -> 26; the remaining 26 are
transitive and out of scope per the issue).

- next 16.2.4 -> 16.2.9 (exact pin preserved)
- mermaid ^11.14.0 -> ^11.15.0 (caret floor raised)
- refresh website/bun.lock; mermaid 11.15.0 restructures its parser
  subtree (drops langium/chevrotain-12/vscode-languageserver-*, adds
  es-toolkit), so the lockfile net shrinks

MermaidBlock securityLevel:"strict" deny-by-default config is unchanged;
the production boundary (Vercel deploy, App Router routes, API functions,
docs-sourced diagrams) stays explicit.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 24, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
gocciascript-homepage Ready Ready Preview, Comment Jun 24, 2026 5:36pm

Request Review

@coderabbitai

coderabbitai Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

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: f3b18393-0a81-4f72-9c76-a60955beef7f

📥 Commits

Reviewing files that changed from the base of the PR and between 7965da6 and 60a2de8.

⛔ Files ignored due to path filters (1)
  • website/bun.lock is excluded by !**/*.lock
📒 Files selected for processing (1)
  • website/package.json

📝 Walkthrough

Walkthrough

Two dependency versions in website/package.json are bumped: mermaid from ^11.14.0 to ^11.15.0 and next from 16.2.4 to 16.2.9. No other files or configuration entries are changed.

Changes

Dependency Version Bumps

Layer / File(s) Summary
next and mermaid version updates
website/package.json
next bumped from 16.2.4 to 16.2.9; mermaid bumped from ^11.14.0 to ^11.15.0.

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~2 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Linked Issues check ❓ Inconclusive The dependency bump is shown, but the refreshed bun.lock is excluded by path filters, so the full advisory fix cannot be verified. Include evidence for the lockfile refresh or remove the path filter exclusion so the patched resolutions can be verified.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly matches the main change: patching website Next.js and Mermaid advisories.
Description check ✅ Passed The description covers summary, scope, issue closure, and testing, and mostly matches the repository template.
Out of Scope Changes check ✅ Passed Only the intended website dependency pins changed, with no unrelated code changes shown in the summary.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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


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

@frostney frostney marked this pull request as ready for review June 24, 2026 17:37
@github-actions

Copy link
Copy Markdown
Contributor

Suite Timing

Test Runner (interpreted: 10,799 passed; bytecode: 10,799 passed)
Metric Interpreted Bytecode
Total 10799 10799
Passed 10799 ✅ 10799 ✅
Workers 4 4
Test Duration 16.73s 16.83s
Lex (cumulative) 568.2ms 526.2ms
Parse (cumulative) 383.3ms 372.9ms
Compile (cumulative) 753.6ms
Execute (cumulative) 96.9ms 35.93s
Engine Total (cumulative) 1.05s 37.58s
Lex (avg/worker) 142.0ms 131.6ms
Parse (avg/worker) 95.8ms 93.2ms
Compile (avg/worker) 188.4ms
Execute (avg/worker) 24.2ms 8.98s
Engine Total (avg/worker) 262.1ms 9.39s

Memory

GC rows aggregate the main thread plus all worker thread-local GCs. Test runner worker shutdown frees thread-local heaps in bulk; that shutdown reclamation is not counted as GC collections or collected objects.

Metric Interpreted Bytecode
GC Live 271.52 MiB 269.28 MiB
GC Peak Live 289.78 MiB 281.60 MiB
GC Allocated During Run 433.42 MiB 425.14 MiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 188 188
GC Collected Objects 1,277,899 1,249,589
Heap Start Allocated 179.0 KiB 179.0 KiB
Heap End Allocated 3.65 MiB 3.65 MiB
Heap Delta Allocated 3.47 MiB 3.47 MiB
Heap Delta Free 1.65 MiB 1.65 MiB
Benchmarks (interpreted: 430; bytecode: 430)
Metric Interpreted Bytecode
Total 430 430
Workers 4 4
Duration 2.83min 2.87min

Memory

GC rows aggregate the main thread plus all worker thread-local GCs. Benchmark runner performs explicit between-file collections, so collection and collected-object counts can be much higher than the test runner.

Metric Interpreted Bytecode
GC Live 6.08 MiB 6.08 MiB
GC Peak Live 98.09 MiB 94.33 MiB
GC Allocated During Run 13.72 GiB 10.66 GiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 3,649 3,549
GC Collected Objects 213,450,701 233,910,368
Heap Start Allocated 3.35 MiB 3.35 MiB
Heap End Allocated 3.35 MiB 3.35 MiB
Heap Delta Allocated 128 B 128 B

Measured on ubuntu-latest x64.

@github-actions

Copy link
Copy Markdown
Contributor

Benchmark Results

430 benchmarks

Interpreted: 🟢 29 improved · 🔴 26 regressed · 375 unchanged · avg +1.0%
Bytecode: 🟢 218 improved · 🔴 5 regressed · 207 unchanged · avg +9.8%

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

Deterministic profile diff

Deterministic profile diff: no significant changes.

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

test262 Conformance

🚫 Regression vs cached main baseline. 2 previously-passing test(s) now fail; pass count Δ +34. This run blocks merge — see "Newly failing" below.

Category Run Passed Δ Pass Failed Pass-rate Δ Rate
built-ins 23,643 22,516 +1 1,127 95.2% ±0pp
harness 116 116 ±0 0 100.0% ±0pp
intl402 3,341 3,332 -2 9 99.7% -0.1pp
language 23,711 23,706 +34 5 100.0% +0.1pp
staging 1,482 1,103 +1 377 74.4% +0.1pp
total 52,293 50,773 +34 1,518 97.1% +0.1pp

Areas closest to 100%

Area Pass rate Δ vs main Passing
built-ins/TypedArray 99.9% ±0pp 1,445 / 1,446
intl402/Temporal 99.8% -0.1pp 2,024 / 2,029
built-ins/Object 99.7% ±0pp 3,401 / 3,411
Per-test deltas (+36 / -2)

Newly failing (2):

  • intl402/Temporal/ZonedDateTime/prototype/hoursInDay/dst-less-than-hour.js
  • intl402/Temporal/ZonedDateTime/prototype/hoursInDay/same-date-starts-twice.js

Newly passing (36):

  • built-ins/Number/prototype/toExponential/undefined-fractiondigits.js
  • language/expressions/call/tco-call-args.js
  • language/expressions/call/tco-member-args.js
  • language/expressions/call/tco-non-eval-function-dynamic.js
  • language/expressions/call/tco-non-eval-function.js
  • language/expressions/call/tco-non-eval-global.js
  • language/expressions/call/tco-non-eval-with.js
  • language/expressions/coalesce/tco-pos-null.js
  • language/expressions/coalesce/tco-pos-undefined.js
  • language/expressions/comma/tco-final.js
  • language/expressions/conditional/tco-cond.js
  • language/expressions/conditional/tco-pos.js
  • language/expressions/logical-and/tco-right.js
  • language/expressions/logical-or/tco-right.js
  • language/expressions/tagged-template/tco-call.js
  • language/expressions/tagged-template/tco-member.js
  • language/expressions/tco-pos.js
  • language/statements/block/tco-stmt-list.js
  • language/statements/block/tco-stmt.js
  • language/statements/do-while/tco-body.js
  • language/statements/for/tco-const-body.js
  • language/statements/for/tco-let-body.js
  • language/statements/for/tco-lhs-body.js
  • language/statements/for/tco-var-body.js
  • language/statements/if/tco-else-body.js
  • language/statements/if/tco-if-body.js
  • language/statements/labeled/tco.js
  • language/statements/return/tco.js
  • language/statements/switch/tco-case-body-dflt.js
  • language/statements/switch/tco-case-body.js
  • language/statements/switch/tco-dftl-body.js
  • language/statements/try/tco-catch-finally.js
  • language/statements/try/tco-catch.js
  • language/statements/try/tco-finally.js
  • language/statements/while/tco-body.js
  • staging/sm/TypedArray/set-same-buffer-different-source-target-types.js

Steady-state failures are non-blocking; regressions vs the cached main baseline (lower total pass count, or any PASS → non-PASS transition) fail the conformance gate. Measured on ubuntu-latest x64, bytecode mode. Areas grouped by the first two test262 path components; minimum 25 attempted tests, areas already at 100% excluded. Δ vs main compares against the most recent cached main baseline.

@frostney frostney merged commit 99e9207 into main Jun 24, 2026
13 of 14 checks passed
@frostney frostney deleted the claude/quirky-bell-002c23 branch June 24, 2026 18:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Update website Next.js and Mermaid advisory patches

1 participant