Skip to content

Add nightly release and update artifact actions to v7#352

Merged
frostney merged 3 commits into
mainfrom
t3code/nightly-build-artifact
Apr 19, 2026
Merged

Add nightly release and update artifact actions to v7#352
frostney merged 3 commits into
mainfrom
t3code/nightly-build-artifact

Conversation

@frostney
Copy link
Copy Markdown
Owner

Summary

  • Add a nightly job to ci.yml that reuses existing CI build artifacts (no rebuild) to publish a rolling nightly pre-release on every push to main, capped at once per day (UTC)
  • Update actions/upload-artifact and actions/download-artifact from deprecated @v5 to @v7 across both ci.yml and pr.yml

Details

Nightly release:

  • Runs after all tests/compliance/benchmarks/CLI checks pass on main
  • Checks if a nightly was already published today — skips if so (max 1/day)
  • Downloads the existing gocciascript-{target} artifacts, packages them into archives, and publishes a nightly pre-release
  • Permanent download URLs: https://github.com/OWNER/REPO/releases/download/nightly/gocciascript-nightly-{platform}.tar.gz
  • Mutually exclusive with the release job (nightly runs on main, release runs on tags)

Artifact action upgrade:

  • actions/upload-artifact@v5@v7 (4 in ci.yml, 3 in pr.yml)
  • actions/download-artifact@v5@v7 (8 in ci.yml, 6 in pr.yml)

Test plan

  • Verify CI workflow passes on this PR (artifact actions v7 compatibility)
  • After merge, confirm nightly release appears under Releases on first push to main
  • Confirm subsequent pushes to main on the same day skip the nightly job
  • Verify tag pushes still create proper releases unaffected by the nightly job

🤖 Generated with Claude Code

- Publish a daily nightly prerelease from main
- Refresh upload/download-artifact actions to v7
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 19, 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: e5d6fdc4-087e-429b-b19d-96c699c619f0

📥 Commits

Reviewing files that changed from the base of the PR and between 3ebac3a and b226eac.

📒 Files selected for processing (1)
  • .github/workflows/ci.yml
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/ci.yml

📝 Walkthrough

Walkthrough

Updated GitHub Actions workflows: upgraded artifact actions (uploads to actions/upload-artifact@v7; downloads in ci.yml use actions/download-artifact@v8) and added a nightly job on main that collects per-target artifacts, stages them, packages per-platform archives (tar.gz / zip), and recreates a nightly pre-release with those archives.

Changes

Cohort / File(s) Summary
CI Workflow & Nightly
\.github/workflows/ci.yml
Replaced actions/upload-artifact@v5 -> actions/upload-artifact@v7 and actions/download-artifact@v5 -> actions/download-artifact@v8; compliance report uploads use upload-artifact@v7; added nightly job that depends on [test, toml-compliance, json5-compliance, benchmark, cli], checks for same-day nightly release, downloads per-target artifacts, runs staging to produce per-platform archives, deletes existing nightly release and recreates it as a pre-release with packaged assets.
PR Workflow Artifact Updates
\.github/workflows/pr.yml
Upgraded actions/upload-artifact and actions/download-artifact from @v5 to @v7 in artifact upload/download steps for builds, tests, and benchmarks; no other step logic changed.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant Jobs as "Matrix Jobs (build/test/bench)"
  participant ArtifactStore as "GitHub Actions Artifacts"
  participant Nightly as "nightly Job (runner)"
  participant Stager as "stage-build-artifacts.sh"
  participant Releases as "GitHub Releases API"

  Jobs->>ArtifactStore: upload per-target artifacts (upload-artifact@v7)
  Note right of ArtifactStore: artifacts persisted across jobs
  Nightly->>ArtifactStore: download all artifacts (download-artifact@v8)
  Nightly->>Stager: run staging per-target -> produce archives
  Stager->>Nightly: return per-platform tar.gz / zip
  Nightly->>Releases: check for existing nightly (UTC date)
  alt existing release
    Nightly->>Releases: delete existing nightly release
  end
  Nightly->>Releases: create nightly pre-release and upload archives
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Description check ❓ Inconclusive The description covers the summary, details of both changes, and a test plan, but does not include the required testing checkboxes or verification statements from the template. Complete the Testing section with specific verification checkboxes and confirm which tests were run to validate the artifact action upgrades and nightly release functionality.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the two main changes: adding a nightly release job and upgrading artifact actions to v7.
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 19, 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: 2

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

Inline comments:
In @.github/workflows/ci.yml:
- Around line 1096-1120: The current "Check if nightly already published today"
step (id: check) uses a non-atomic read-then-write (TODAY/PUBLISHED) which
allows a race where two workflow runs both decide to proceed; fix by making the
operation atomic: instead of relying solely on PUBLISHED, attempt to create the
nightly release (or call the Releases API to create a release with name
"nightly" / tag "nightly" targeting main) and treat a "release already exists"
error as the signal to set skip=true; update the step to use GH_TOKEN and `gh`
or `gh api` to create the release and on success set skip=false, on a 422/exists
error set skip=true, and only delete/recreate if the create succeeded — this
ensures the create is the atomic check-and-set rather than the current two-step
check using TODAY/PUBLISHED.
- Around line 1168-1183: The release tag is being pinned to the moving branch
via "gh release create nightly ... --target main" which can point at a different
commit than the built artifacts; change the target to the tested commit by using
the COMMIT you already compute (e.g. replace "--target main" with "--target
\"${COMMIT}\"" or compute the full SHA with COMMIT="$(git rev-parse HEAD)" and
pass that to "gh release create nightly" so the nightly release references the
exact tested commit.
🪄 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: ba908516-4b45-44de-b78d-f733ece92ff3

📥 Commits

Reviewing files that changed from the base of the PR and between d687a75 and 97e3d79.

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

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

github-actions Bot commented Apr 19, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 5805 5805
Tests Passed 5764 ✅ 5805 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 1.30s 1.41s
Tests Lex (cumulative) 182.7ms 121.8ms
Tests Parse (cumulative) 257.6ms 241.3ms
Tests Compile (cumulative) 168.7ms
Tests Execute (cumulative) 1.26s 1.30s
Tests Engine Total (cumulative) 1.70s 1.83s
Tests Lex (avg/worker) 45.7ms 30.5ms
Tests Parse (avg/worker) 64.4ms 60.3ms
Tests Compile (avg/worker) 42.2ms
Tests Execute (avg/worker) 316.0ms 324.3ms
Tests Engine Total (avg/worker) 426.1ms 457.3ms
Benchmarks Total 386 386
Benchmarks Workers 4 4
Benchmarks Duration 3.11min 2.93min

Measured on ubuntu-latest x64.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 19, 2026

Benchmark Results

386 benchmarks

Interpreted: 🟢 346 improved · 🔴 10 regressed · 30 unchanged · avg +11.0%
Bytecode: 🟢 46 improved · 🔴 76 regressed · 264 unchanged · avg -0.3%

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

- Add concurrency group to serialize nightly job across workflow runs
- Use full commit SHA instead of branch name for --target to ensure
  the release tag points at the exact tested commit

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@frostney
Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 19, 2026

✅ Actions performed

Review triggered.

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

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:
- Line 247: Update the workflow to use the latest matching upload/download
artifact actions: replace usages of actions/download-artifact@v7 with
actions/download-artifact@v8 (or the specific latest tag, e.g., v8.0.1) to align
with actions/upload-artifact@v7 and ensure you reference the exact action
identifiers (actions/download-artifact and actions/upload-artifact) in the CI
YAML so both steps use current, consistent versions.
🪄 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: f6b73f60-3f06-4715-9b14-2c32603ce0da

📥 Commits

Reviewing files that changed from the base of the PR and between 97e3d79 and 3ebac3a.

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

Comment thread .github/workflows/ci.yml
- Bump GitHub Actions artifact download steps from `actions/download-artifact@v7` to `@v8`
- Keep CI workflows aligned with the newer artifact action
@frostney frostney merged commit 66c2ba1 into main Apr 19, 2026
10 checks passed
@frostney frostney deleted the t3code/nightly-build-artifact branch April 19, 2026 10: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