Skip to content

Fix CI cross toolchain resource compiler#442

Merged
frostney merged 4 commits into
mainfrom
t3code/fpc-resource-fix
Apr 28, 2026
Merged

Fix CI cross toolchain resource compiler#442
frostney merged 4 commits into
mainfrom
t3code/fpc-resource-fix

Conversation

@frostney
Copy link
Copy Markdown
Owner

Summary

  • include fpcres in the cached FPC cross toolchain
  • bump the toolchain cache version so CI rebuilds the cache
  • add an early CI check for missing fpcres before cross-compilation starts

Verification

  • bun check-swimmies.ts .github/workflows/toolchain.yml .github/workflows/ci.yml
  • ruby -e 'require "yaml"; ARGV.each { |file| YAML.load_file(file); puts "parsed #{file}" }' .github/workflows/toolchain.yml .github/workflows/ci.yml
  • git diff --check

This fixes the CI failure where FPC cannot find fpcres while linking the generated timezone resource.

@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 28, 2026

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

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
gocciascript-homepage Ignored Ignored Preview Apr 28, 2026 7:30pm

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 28, 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: c7943445-fa71-4ddd-a66e-6077674b581d

📥 Commits

Reviewing files that changed from the base of the PR and between 854ae5d and 6091838.

📒 Files selected for processing (1)
  • source/units/Goccia.Temporal.TimeZone.pas

📝 Walkthrough

Walkthrough

CI and toolchain workflows updated to ensure fpcres is present in the restored/cached toolchain (cache version bumped). Two Pascal units adjusted: one makes a resource type explicit; the other changes how ICU symbols from GetProcAddress are cast into typed procedure/function pointers.

Changes

Cohort / File(s) Summary
CI Validation
.github/workflows/ci.yml
Adds a post-restore sanity check that verifies "$PREFIX/bin/fpcres" exists and is executable; emits ::error::fpcres not found in restored FPC toolchain and exits if missing.
Toolchain Cache & Staging
.github/workflows/toolchain.yml
Bumps CACHE_VERSION v32v33 and copies fpcres into the native toolchain staging prefix so cached fpc-cross includes the executable.
Resource Loading Explicit Type
source/units/Goccia.Temporal.TimeZoneData.pas
Introduces a local TIME_ZONE_RCDATA_RESOURCE_TYPE constant (via MAKEINTRESOURCE(10)) and uses it in TResourceStream.Create instead of RT_RCDATA.
ICU Symbol Binding Casts
source/units/Goccia.Temporal.TimeZone.pas
Changes dynamic symbol loading to cast each GetProcAddress result directly to the specific typed pointer (e.g., TICUCalendarOpen) when assigning library symbols.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested labels

internal

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Description check ❓ Inconclusive The description includes a clear summary of changes and verification steps, but the template requires a Testing section with checkboxes that is not properly filled out in the PR description. Complete the Testing section from the template by checking relevant boxes or explicitly noting which tests were performed to validate the changes.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title "Fix CI cross toolchain resource compiler" accurately reflects the main objective of the PR: fixing the CI toolchain to include fpcres for resource compilation.
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 the bug Something isn't working label Apr 28, 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 @.github/workflows/ci.yml:
- Around line 70-73: Replace the generic PATH lookup with an explicit check of
the restored toolchain binary: instead of using `command -v fpcres`, test the
file at "$PREFIX/bin/fpcres" (e.g., check existence and executability with a
test like [ -x "$PREFIX/bin/fpcres" ]) and fail with the same error/exit if that
check fails; update the conditional that currently references `command -v
fpcres` to use the "$PREFIX/bin/fpcres" executable check so we verify the
restored cache contains the expected binary.
🪄 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: ce72a0bc-24ae-4ddd-aba8-e717ffc6bbc6

📥 Commits

Reviewing files that changed from the base of the PR and between 785607e and 75de28a.

📒 Files selected for processing (2)
  • .github/workflows/ci.yml
  • .github/workflows/toolchain.yml

Comment thread .github/workflows/ci.yml Outdated
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 28, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 8056 8056
Tests Passed 8015 ✅ 8056 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 1.81s 1.40s
Tests Lex (cumulative) 210.6ms 96.9ms
Tests Parse (cumulative) 316.4ms 241.1ms
Tests Compile (cumulative) 141.3ms
Tests Execute (cumulative) 1.45s 1.09s
Tests Engine Total (cumulative) 1.97s 1.57s
Tests Lex (avg/worker) 52.7ms 24.2ms
Tests Parse (avg/worker) 79.1ms 60.3ms
Tests Compile (avg/worker) 35.3ms
Tests Execute (avg/worker) 361.9ms 272.7ms
Tests Engine Total (avg/worker) 493.6ms 392.5ms
Benchmarks Total 386 386
Benchmarks Workers 4 4
Benchmarks Duration 2.93min 2.97min

Measured on ubuntu-latest x64.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 28, 2026

Benchmark Results

386 benchmarks

Interpreted: 🟢 8 improved · 🔴 177 regressed · 201 unchanged · avg -2.3%
Bytecode: 🟢 77 improved · 🔴 52 regressed · 257 unchanged · avg +0.6%

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

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.

@coderabbitai coderabbitai Bot added the internal Refactoring, CI, tooling, cleanup label Apr 28, 2026
@frostney frostney merged commit cde140f into main Apr 28, 2026
58 checks passed
@frostney frostney deleted the t3code/fpc-resource-fix branch April 28, 2026 19:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working internal Refactoring, CI, tooling, cleanup

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant