Skip to content

Fix cross-build linking for RegExpr units#180

Merged
frostney merged 3 commits into
mainfrom
fix/cross-regexpr
Apr 3, 2026
Merged

Fix cross-build linking for RegExpr units#180
frostney merged 3 commits into
mainfrom
fix/cross-regexpr

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Apr 3, 2026

Summary

  • Added regexpr package sources to the cached cross-compilation toolchain so FPC can resolve RegExpr during cross builds.
  • Updated CI cross-build checks and compiler include paths to verify and use the new source location.
  • Documented the expanded cross-build dependency set in docs/build-system.md.
  • Added cross-arch linker artifact files to support the RegExpr test case on macOS arm64.

Testing

  • Not run locally.
  • CI cross-build path updated to verify regexpr sources exist before building.
  • Toolchain cache version bumped to force regeneration with the new package sources.

Summary by CodeRabbit

Release Notes

  • Chores
    • Improved build system CI workflow and toolchain caching to ensure proper support for regex expression package dependencies
    • Enhanced compiler configuration to correctly resolve package sources during all compilation steps
    • Updated build documentation to reflect current caching strategy and package configuration

frostney added 2 commits April 3, 2026 23:50
- Include generated linker inputs for the RegExpr test build
- Fix arm64 macOS linking on cross-regexpr branch
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 3, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 0a2b763a-f419-4d78-8b53-a75ed88b759b

📥 Commits

Reviewing files that changed from the base of the PR and between b169b81 and 52abf09.

📒 Files selected for processing (3)
  • .github/workflows/ci.yml
  • .github/workflows/toolchain.yml
  • docs/build-system.md

📝 Walkthrough

Walkthrough

This pull request adds the regexpr Free Pascal package to the CI and toolchain workflows by including it in the compiler search paths, caching it in the workflow cache, and updating related documentation to reflect the expanded package support.

Changes

Cohort / File(s) Summary
CI & Toolchain Workflows
.github/workflows/ci.yml, .github/workflows/toolchain.yml
Added regexpr package source to FPC compiler search paths via new REGEXPR_SRC variable and included directory existence checks; extended toolchain cache to copy regexpr sources alongside fcl-base, with cache version incremented from v29 to v30.
Documentation
docs/build-system.md
Updated GitHub Actions workflow cache documentation to reflect that regexpr sources are now cached and included in the list of on-demand resolvable units alongside Base64.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~8 minutes

Possibly related PRs

Poem

🐰 With regex now in sight,
Our build paths shine so bright,
Through workflows we now hop,
No pattern searches stop,
Free Pascal's powers take flight! ✨

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title directly addresses the main change: adding RegExpr package sources to enable cross-compilation linking, which aligns with all file modifications.
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.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/cross-regexpr

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 3, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 3623 3623
Tests Passed 3582 ✅ 3623 ✅
Tests Skipped 41 0
Tests Execution 200.1ms 186.5ms
Tests Engine 367.2ms 643.9ms
Benchmarks Total 274 274
Benchmarks Duration 7.40min 6.14min

Measured on ubuntu-latest x64.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 3, 2026

Benchmark Results

274 benchmarks

Interpreted: 🟢 81 improved · 🔴 139 regressed · 🆕 11 new · 43 unchanged · avg -2.0%
Bytecode: 🟢 21 improved · 🔴 177 regressed · 🆕 11 new · 65 unchanged · avg -3.7%

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

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.

@frostney frostney merged commit 8ac685e into main Apr 3, 2026
9 checks passed
@frostney frostney deleted the fix/cross-regexpr branch April 3, 2026 23:54
@frostney frostney added the bug Something isn't working label Apr 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant