Skip to content

Add fetch host allowlist support#395

Merged
frostney merged 2 commits into
mainfrom
t3code/test-runner-slowdown
Apr 24, 2026
Merged

Add fetch host allowlist support#395
frostney merged 2 commits into
mainfrom
t3code/test-runner-slowdown

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Apr 24, 2026

Fixes fetch on JS test suite to now mock the fetch call as otherwise as dealt with a performance regression

- Split blocked-host assertions from allowed-host dispatch checks
- Use a fetch spy to avoid real network traffic in allowlisted cases
- Keep allowlist behavior covered via the e2e script
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 24, 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: a6b1fe80-c8f5-45f7-b098-00404d187d86

📥 Commits

Reviewing files that changed from the base of the PR and between b998961 and 5396bc5.

📒 Files selected for processing (1)
  • tests/built-ins/fetch/fetch-allowed-hosts.js
🚧 Files skipped from review as they are similar to previous changes (1)
  • tests/built-ins/fetch/fetch-allowed-hosts.js

📝 Walkthrough

Walkthrough

Refactors fetch host tests: blocked-host cases moved to a real-fetch suite that asserts synchronous TypeError containing the blocked hostname; allowed-host cases are converted to a mocked-fetch suite that spies on globalThis.fetch and verifies allowed URLs are passed through.

Changes

Cohort / File(s) Summary
Fetch allowed/blocked host tests
tests/built-ins/fetch/fetch-allowed-hosts.js
Reorganized tests into a real-fetch blocked-host suite (synchronous TypeError with hostname in message) and a mocked-fetch allowed-host suite (replaces globalThis.fetch with a spy returning a resolved Response; asserts spy received exact input URLs across host case, port, path, and userinfo variants).

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The PR description is incomplete. It lacks the required template structure with Summary and Testing sections, missing key details about the change implementation and verification steps. Restructure the description to follow the template with Summary and Testing sections. Add details about implementation constraints and link to related issues; confirm test verification checkboxes.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Add fetch host allowlist support' is directly related to the main changes described in the PR, which involve adding host allowlist functionality to the fetch implementation.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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


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

@coderabbitai coderabbitai Bot added documentation Improvements or additions to documentation new feature New feature or request labels Apr 24, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

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

Inline comments:
In `@tests/built-ins/fetch/fetch-allowed-hosts.js`:
- Around line 34-81: The tests currently mock globalThis.fetch for every test,
which prevents exercising the allowlist code path; modify the suite so at least
one test (e.g., "allowed host proceeds to network request") calls the real fetch
against an allowlisted host instead of the mocked spy: keep the spy-based
assertions for dispatch shape in other tests, but in that positive-path test
call spy.mockRestore() (or temporarily avoid mocking) before invoking
globalThis.fetch("http://0.0.0.0:1/") so ValidateHost runs, await the real
response and assert the request completed (and optionally that spy was not
used), then re-establish the mock for the remaining tests. Ensure you reference
and update the existing spy variable and the named test to locate the change.
🪄 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: 7cdb1518-8619-44b7-b9fb-aae0c880740c

📥 Commits

Reviewing files that changed from the base of the PR and between 466861b and b998961.

📒 Files selected for processing (1)
  • tests/built-ins/fetch/fetch-allowed-hosts.js

Comment thread tests/built-ins/fetch/fetch-allowed-hosts.js
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 24, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 7759 7759
Tests Passed 7718 ✅ 7759 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 1.50s 1.50s
Tests Lex (cumulative) 189.8ms 127.9ms
Tests Parse (cumulative) 283.0ms 292.6ms
Tests Compile (cumulative) 182.2ms
Tests Execute (cumulative) 1.79s 1.46s
Tests Engine Total (cumulative) 2.26s 2.06s
Tests Lex (avg/worker) 47.4ms 32.0ms
Tests Parse (avg/worker) 70.8ms 73.2ms
Tests Compile (avg/worker) 45.6ms
Tests Execute (avg/worker) 447.6ms 365.5ms
Tests Engine Total (avg/worker) 565.8ms 516.2ms
Benchmarks Total 386 386
Benchmarks Workers 4 4
Benchmarks Duration 3.08min 2.83min

Measured on ubuntu-latest x64.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 24, 2026

Benchmark Results

386 benchmarks

Interpreted: 🟢 328 improved · 🔴 12 regressed · 46 unchanged · avg +7.5%
Bytecode: 🟢 320 improved · 🔴 23 regressed · 43 unchanged · avg +8.1%

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

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

Address CodeRabbit review feedback on PR #395: the mocked allowed-host
tests verify dispatch shape but bypass ValidateHost, so an allowlist
acceptance regression could slip through. Add a single real-fetch test
against 0.0.0.0:1 (allowlisted, refuses instantly on loopback) so the
positive path of ValidateHost is exercised without reintroducing the
network hang.

Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
@frostney frostney merged commit a11b6ee into main Apr 24, 2026
10 checks passed
@frostney frostney deleted the t3code/test-runner-slowdown branch April 24, 2026 11:23
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 new feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant