Skip to content

Add fcl-net and OpenSSL to cross-build toolchain#339

Merged
frostney merged 3 commits into
mainfrom
t3code/add-sockets-cross-compile
Apr 18, 2026
Merged

Add fcl-net and OpenSSL to cross-build toolchain#339
frostney merged 3 commits into
mainfrom
t3code/add-sockets-cross-compile

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Apr 18, 2026

Summary

  • Added fcl-net and openssl source packages to the cached FPC toolchain assets.
  • Updated cross-build CI to include the new source lookup paths when compiling targets.
  • Bumped the toolchain cache version so workflows rebuild with the expanded package set.

- Copy `fcl-net` and `openssl` sources into the toolchain cache
- Add their source paths to CI cross-compilation include lists
- Bump toolchain cache version to invalidate stale builds
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 18, 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: 4fd30086-8b7f-4102-a8f7-e01f6303a58c

📥 Commits

Reviewing files that changed from the base of the PR and between 4694451 and 7190f7b.

📒 Files selected for processing (1)
  • source/shared/HTTPClient.pas

📝 Walkthrough

Walkthrough

Adds fcl-net and openssl package sources into the CI/toolchain FPC source tree, appends them to compiler unit include paths for cross-compilation, bumps the workflow cache version, conditionally builds missing socket RTL units, and adjusts Windows getaddrinfo/freeaddrinfo FFI usage in the HTTP client.

Changes

Cohort / File(s) Summary
CI compiler include paths
.github/workflows/ci.yml
Detects and prints fcl-net and openssl source dirs and appends them to compiler -Fu unit include paths for all cross-compilation invocations (entrypoints, unit tests, compliance harnesses).
Toolchain setup & RTL fixes
.github/workflows/toolchain.yml
Bumps CACHE_VERSION (v30 → v32), copies fcl-net and openssl into "$PREFIX/share/fpcsrc/packages/", and conditionally compiles missing socket RTL units (rtl/unix/sockets.ppsockets.ppu on linux/darwin; rtl/win/winsock2.ppwinsock2.ppu on win32/win64`).
Windows socket FFI
source/shared/HTTPClient.pas
Replaces direct WinSock calls getaddrinfo/freeaddrinfo with Pascal-declared wrappers Getaddrinfo/Freeaddrinfo and uses explicit TAddrInfo/PAddrInfo types in ConnectSocket on Windows.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description covers the main changes and links to the PR, but omits the required Testing section with checkboxes and testing details. Add the Testing section with checkbox items indicating which tests were performed or why they don't apply to this workflow/toolchain change.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: adding fcl-net and OpenSSL to the cross-build toolchain, which is reflected in all modified files (ci.yml, toolchain.yml, and HTTPClient.pas adjustments for Windows socket support).
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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


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

@coderabbitai coderabbitai Bot added the internal Refactoring, CI, tooling, cleanup label Apr 18, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 18, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 5679 5679
Tests Passed 5638 ✅ 5679 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 1.20s 1.20s
Tests Lex (cumulative) 188.9ms 108.6ms
Tests Parse (cumulative) 253.5ms 250.9ms
Tests Compile (cumulative) 157.3ms
Tests Execute (cumulative) 1.17s 1.31s
Tests Engine Total (cumulative) 1.62s 1.82s
Tests Lex (avg/worker) 47.2ms 27.1ms
Tests Parse (avg/worker) 63.4ms 62.7ms
Tests Compile (avg/worker) 39.3ms
Tests Execute (avg/worker) 293.3ms 326.4ms
Tests Engine Total (avg/worker) 403.8ms 455.6ms
Benchmarks Total 386 386
Benchmarks Workers 4 4
Benchmarks Duration 3.19min 2.83min

Measured on ubuntu-latest x64.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 18, 2026

Benchmark Results

386 benchmarks

Interpreted: 🟢 378 improved · 🔴 5 regressed · 3 unchanged · avg +24.2%
Bytecode: 🟢 72 improved · 🔴 72 regressed · 242 unchanged · avg +0.3%

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

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.

The cross make rtl does not produce sockets.ppu (Unix/Darwin) or
winsock2.ppu (Windows), so HTTPClient.pas fails to compile on every
non-native target. Explicitly compile these units from the FPC RTL
source after the core RTL build, and install them into the RTL
directory so the CI cross-compile step finds them.

Bump cache version to v32 to force a toolchain rebuild.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@frostney frostney force-pushed the t3code/add-sockets-cross-compile branch from f468e54 to 4694451 Compare April 18, 2026 16:58
FPC 3.2.2's WinSock2 unit does not include getaddrinfo, freeaddrinfo,
or the TAddrInfo record. Declare them inline so HTTPClient compiles on
Windows cross-targets.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@frostney frostney merged commit 1a77f01 into main Apr 18, 2026
55 checks passed
@frostney frostney deleted the t3code/add-sockets-cross-compile branch April 18, 2026 17:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

internal Refactoring, CI, tooling, cleanup

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant