Skip to content

Strip staged build artifacts with llvm-strip#245

Merged
frostney merged 1 commit into
mainfrom
t3code/strip-symbols-artifacts
Apr 9, 2026
Merged

Strip staged build artifacts with llvm-strip#245
frostney merged 1 commit into
mainfrom
t3code/strip-symbols-artifacts

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Apr 9, 2026

Summary

  • Update the artifact staging script to prefer llvm-strip, with strip as a fallback, so build outputs are stripped more reliably across platforms.
  • Enable stripping for CI-staged build artifacts, while leaving release artifact packaging unstripped in the workflow.
  • Remove redundant --strip flags from release packaging steps to match the intended artifact contents.

Testing

  • Not run (PR content only).
  • Reviewed the workflow and staging script diff to confirm the --strip behavior now applies only where intended.
  • Confirmed the script now falls back from llvm-strip to strip without failing the staging step.

- Prefer `llvm-strip` with fallback to platform `strip`
- Strip CI artifacts during staging and leave release packaging unstripped
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 9, 2026

📝 Walkthrough

Walkthrough

The artifact staging script now uses llvm-strip as the primary stripping tool with fallback to strip, adds explicit file existence checks to process only regular files, and the CI workflow removes the --strip flag from all invocations of the staging script.

Changes

Cohort / File(s) Summary
Strip Script Enhancement
.github/scripts/stage-build-artifacts.sh
Added explicit file existence guard (if [ -f "$bin" ]) and implemented two-tier stripping strategy: attempts llvm-strip first with fallback to strip, both with stderr suppression.
CI Workflow Updates
.github/workflows/ci.yml
Removed --strip flag from three invocations of stage-build-artifacts.sh across ci-artifacts, release-artifacts, and release packaging loop stages.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~8 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 section well but the Testing section uses placeholder language ('Not run', 'PR content only') instead of concrete verification details. Clarify the Testing section with specific verification steps performed (e.g., script tested locally, CI runs validated) or confirm testing limitations more explicitly.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: updating artifact staging to use llvm-strip, which matches the primary modification in the staging script.
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.

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 208: The workflow currently runs stage-build-artifacts.sh with the
--strip flag when producing the "ci-artifacts" bundle, causing later release
packaging to repackage stripped binaries; instead, produce and publish a
separate unstripped artifact and have the release packaging step consume that.
Remove --strip only from the unstripped build invocation (e.g., call
stage-build-artifacts.sh build release-unstripped --include-tests without
--strip), keep the stripped CI artifact if needed, and update the release
packaging job to download/use the new "release-unstripped" artifact (references:
the stage-build-artifacts.sh invocation, the --strip flag, and the
"ci-artifacts" artifact name).
🪄 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: 78b0f9b2-2819-4a6a-acf9-d58443599f5f

📥 Commits

Reviewing files that changed from the base of the PR and between aa89efe and 6a93f3b.

📒 Files selected for processing (2)
  • .github/scripts/stage-build-artifacts.sh
  • .github/workflows/ci.yml

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

github-actions Bot commented Apr 9, 2026

Benchmark Results

274 benchmarks

Interpreted: 🟢 193 improved · 🔴 48 regressed · 33 unchanged · avg +4.6%
Bytecode: 🟢 79 improved · 🔴 64 regressed · 131 unchanged · avg +0.5%

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

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.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 9, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 4046 4046
Tests Passed 4005 ✅ 4046 ✅
Tests Skipped 41 0
Tests Test Duration 270.0ms 263.5ms
Tests Lex 78.7ms 53.6ms
Tests Parse 102.7ms 97.3ms
Tests Compile 62.0ms
Tests Execute 284.4ms 293.7ms
Tests Engine Total 465.9ms 506.6ms
Benchmarks Total 274 274
Benchmarks Duration 7.45min 6.39min

Measured on ubuntu-latest x64.

@frostney frostney merged commit 696c5e5 into main Apr 9, 2026
9 checks passed
@frostney frostney deleted the t3code/strip-symbols-artifacts branch April 9, 2026 11:54
@frostney frostney added the internal Refactoring, CI, tooling, cleanup label Apr 9, 2026
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