Skip to content

Refresh docs and website to match recent feature set#460

Merged
frostney merged 1 commit into
mainfrom
t3code/docs-readme-goals-update
Apr 29, 2026
Merged

Refresh docs and website to match recent feature set#460
frostney merged 1 commit into
mainfrom
t3code/docs-readme-goals-update

Conversation

@frostney
Copy link
Copy Markdown
Owner

Summary

  • Updated README.md Built-in Objects list to include the recently added typed arrays (Float16Array, BigInt64Array, BigUint64Array) and bumped the test-count claim from 3400+ to 8000+ (the runner currently reports 8235 tests across 1041 files).
  • Refreshed docs/goals.md so the security framing matches what actually shipped: fetch is no longer "not yet implemented" — it's a WHATWG GET/HEAD subset gated by --allowed-host. The function-constructor / function-keyword bullet is reframed around the --unsafe-function-constructor and --compat-function opt-ins, and the same framing is carried through the sandbox caveat paragraph and the "What GocciaScript is Not" section (so var and function are no longer listed as "will not be added").
  • Updated the website landing page copy from "portable runtime under 5MB" to "portable runtime under 6MB".

This is a documentation-only pass — no behavior changes. The intent was to update existing claims that the last ~200 commits had falsified, not to add new sections.

Test plan

  • git diff reviewed — only the three intended files change.
  • Pre-commit hooks pass (markdown lint, doc link check, doc symbol check, doc length, doc duplication is warning-only and unrelated to this diff).
  • Test count verified locally: ./build/GocciaTestRunner tests --asi --unsafe-ffi --no-progress --jobs=4 → 8235 tests across 1041 files.
  • Visual check of the website landing page tooltip after Vercel preview deploy.

🤖 Generated with Claude Code

- README: list Float16Array, BigInt64Array, BigUint64Array; bump test
  count from 3400+ to 8000+ to reflect the current suite size.
- docs/goals.md: replace "not yet implemented" wording for fetch with
  the shipped WHATWG GET/HEAD subset gated by --allowed-host; reframe
  the function-constructor and `function`-keyword bullet around the
  --unsafe-function-constructor and --compat-function opt-ins, and
  carry the same framing through the sandbox caveat and the
  "What GocciaScript is Not" list (var/function are now opt-in
  compat toggles).
- website landing: portable runtime size copy 5MB -> 6MB.

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

vercel Bot commented Apr 29, 2026

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

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

@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: 76d862e3-5d44-4aef-81bd-dc4b08d874ec

📥 Commits

Reviewing files that changed from the base of the PR and between d9b5e52 and 8f47c01.

📒 Files selected for processing (3)
  • README.md
  • docs/goals.md
  • website/src/components/landing.tsx

📝 Walkthrough

Walkthrough

Documentation updates across README, goals, and landing page. README extends TypedArrays examples and updates test count. Goals document describes a WHATWG fetch implementation with host allowlist enforcement and updated dynamic code generation policies. Landing page copy updates portable runtime size limit.

Changes

Cohort / File(s) Summary
Documentation
README.md, docs/goals.md
README adds additional TypedArray examples and updates JavaScript unit test count. Goals document specifies WHATWG fetch implementation with host allowlist requirement and details dynamic code generation policies (--unsafe-function-constructor, --compat-function, --compat-var).
Website Components
website/src/components/landing.tsx
Updates copy in Design principles section to reflect portable runtime size change from "under 5MB" to "under 6MB".

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~3 minutes

Possibly related PRs

Suggested labels

documentation

🚥 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 summarizes the pull request's core objective—updating documentation and website content to reflect recent features and shipped behavior.
Description check ✅ Passed The description covers all required sections: a detailed summary of changes with issue links context, comprehensive testing verification with checkmarks, and clear rationale for the updates.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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


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

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

@coderabbitai coderabbitai Bot added the documentation Improvements or additions to documentation label Apr 29, 2026
@github-actions
Copy link
Copy Markdown
Contributor

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 8269 8269
Tests Passed 8228 ✅ 8269 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 2.01s 1.90s
Tests Lex (cumulative) 232.3ms 141.4ms
Tests Parse (cumulative) 329.5ms 325.9ms
Tests Compile (cumulative) 205.1ms
Tests Execute (cumulative) 1.85s 1.54s
Tests Engine Total (cumulative) 2.41s 2.21s
Tests Lex (avg/worker) 58.1ms 35.3ms
Tests Parse (avg/worker) 82.4ms 81.5ms
Tests Compile (avg/worker) 51.3ms
Tests Execute (avg/worker) 461.9ms 385.4ms
Tests Engine Total (avg/worker) 602.4ms 553.5ms
Benchmarks Total 407 407
Benchmarks Workers 4 4
Benchmarks Duration 2.50min 2.36min

Measured on ubuntu-latest x64.

@github-actions
Copy link
Copy Markdown
Contributor

Benchmark Results

407 benchmarks

Interpreted: 🟢 31 improved · 🔴 259 regressed · 117 unchanged · avg -2.7%
Bytecode: 🟢 64 improved · 🔴 83 regressed · 260 unchanged · avg -0.0%

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

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

@frostney frostney merged commit 01ed96e into main Apr 29, 2026
12 checks passed
@frostney frostney deleted the t3code/docs-readme-goals-update branch April 29, 2026 17:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant