Skip to content

Declare Content Signals in robots.txt#449

Merged
frostney merged 2 commits into
mainfrom
t3code/content-signals-robots
Apr 29, 2026
Merged

Declare Content Signals in robots.txt#449
frostney merged 2 commits into
mainfrom
t3code/content-signals-robots

Conversation

@frostney
Copy link
Copy Markdown
Owner

Summary

  • serve robots.txt through an explicit text route so nonstandard Content-Signal directives are preserved
  • declare ai-train=no, search=yes, and ai-input=no while keeping existing crawl rules and sitemap
  • add a focused Bun test for the generated robots.txt response

Verification

  • bun run lint
  • bun test
  • bun run build

@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 29, 2026

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

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

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 29, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: d4e9c2f2-db39-434d-bbde-50e81c803b08

📥 Commits

Reviewing files that changed from the base of the PR and between 8394ae5 and 9eb47f0.

📒 Files selected for processing (2)
  • website/src/__tests__/robots.test.ts
  • website/src/app/robots.txt/route.ts
✅ Files skipped from review due to trivial changes (1)
  • website/src/app/robots.txt/route.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • website/src/tests/robots.test.ts

📝 Walkthrough

Walkthrough

Robots.txt generation moved from a Next.js metadata export to an explicit GET route at robots.txt that returns a plain-text robots file. A new Bun test verifies status, content-type, body contents, and sitemap URL behavior based on NEXT_PUBLIC_SITE_URL.

Changes

Cohort / File(s) Summary
Robots route & tests
website/src/app/robots.ts, website/src/app/robots.txt/route.ts, website/src/__tests__/robots.test.ts
Removed the metadata-based robots export and added a robots.txt route (GET) that builds plain-text robots content (includes User-agent, Content-Signal, Allow, Disallow, and Sitemap) deriving site URL from NEXT_PUBLIC_SITE_URL with validation/fallback. Added tests that set env var variations, call GET(), and assert status 200, text/plain; charset=utf-8, and exact body including sitemap fallback behavior.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately and concisely summarizes the main change: declaring Content Signals (specifically ai-train, search, and ai-input directives) in the robots.txt file.
Description check ✅ Passed The description covers the key changes (serving robots.txt via explicit route with Content-Signal directives) and includes verification steps, but uses a non-standard format that doesn't match the template structure.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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


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

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

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

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

Inline comments:
In `@website/src/__tests__/robots.test.ts`:
- Around line 12-15: Add an explicit status assertion to the test by asserting
response.status is 200; locate the test in website/src/__tests__/robots.test.ts
where the test inspects response.headers and response.text (the variable is
response) and insert expect(response.status).toBe(200) before or alongside the
existing header/body assertions to lock in successful response semantics.

In `@website/src/app/robots.txt/route.ts`:
- Around line 3-8: getSiteUrl currently returns NEXT_PUBLIC_SITE_URL without
validating it, which can produce malformed Sitemap directives if the env is
blank/whitespace or missing scheme; update getSiteUrl to defensively parse and
normalize the value (trim input, attempt to construct a URL inside a try/catch
like layout.tsx does, fallback to DEFAULT_SITE_URL on failure), then strip
trailing slashes before returning so Sitemap lines are always valid; reference
the getSiteUrl function and mirror the validation/URL-construction and fallback
logic used in website/src/app/layout.tsx.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: b3c74de5-22e5-4ddd-a81e-c1f2c734b370

📥 Commits

Reviewing files that changed from the base of the PR and between 2c96f54 and 8394ae5.

📒 Files selected for processing (3)
  • website/src/__tests__/robots.test.ts
  • website/src/app/robots.ts
  • website/src/app/robots.txt/route.ts
💤 Files with no reviewable changes (1)
  • website/src/app/robots.ts

Comment thread website/src/__tests__/robots.test.ts
Comment thread website/src/app/robots.txt/route.ts
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 29, 2026

Benchmark Results

407 benchmarks

Interpreted: 🟢 21 improved · 🔴 136 regressed · 250 unchanged · avg -1.1%
Bytecode: 🟢 7 improved · 🔴 398 regressed · 2 unchanged · avg -27.2%

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

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 29, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 8243 8243
Tests Passed 8202 ✅ 8243 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 1.90s 2.01s
Tests Lex (cumulative) 215.5ms 138.9ms
Tests Parse (cumulative) 323.8ms 339.2ms
Tests Compile (cumulative) 202.3ms
Tests Execute (cumulative) 1.72s 1.62s
Tests Engine Total (cumulative) 2.26s 2.30s
Tests Lex (avg/worker) 53.9ms 34.7ms
Tests Parse (avg/worker) 80.9ms 84.8ms
Tests Compile (avg/worker) 50.6ms
Tests Execute (avg/worker) 429.8ms 405.7ms
Tests Engine Total (avg/worker) 564.6ms 575.8ms
Benchmarks Total 407 407
Benchmarks Workers 4 4
Benchmarks Duration 2.48min 2.30min

Measured on ubuntu-latest x64.

@frostney
Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 29, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@frostney frostney merged commit d5e5489 into main Apr 29, 2026
12 checks passed
@frostney frostney deleted the t3code/content-signals-robots branch April 29, 2026 11:58
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.

1 participant