Skip to content

Build 32-bit FFI fixture DLL on Windows CI#227

Merged
frostney merged 2 commits into
mainfrom
t3code/win32-ffi-fix
Apr 8, 2026
Merged

Build 32-bit FFI fixture DLL on Windows CI#227
frostney merged 2 commits into
mainfrom
t3code/win32-ffi-fix

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Apr 8, 2026

Summary

  • Build the FFI fixture DLL with a 32-bit MinGW toolchain when the Windows matrix target is i386-win32.
  • Keep the existing default Windows build path for non-32-bit targets.
  • This fixes the Windows CI setup so the 32-bit TestRunner can load a matching DLL.

Testing

  • Not run (CI workflow change only).
  • Verified the workflow condition now switches to C:/msys64/mingw32/bin/gcc.exe after installing mingw-w64-i686-gcc for i386-win32.
  • Verified the non-i386-win32 Windows path still uses the existing gcc invocation.

- Install the i686 MinGW toolchain for `i386-win32` jobs
- Use a 32-bit `libfixture.dll` when running the 32-bit TestRunner
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 8, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 250a20ee-4ff5-43ed-a30e-edf973015766

📥 Commits

Reviewing files that changed from the base of the PR and between 094a1ce and e45243a.

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

📝 Walkthrough

Walkthrough

CI workflow updated to run target-aware Windows FFI fixture builds: adds an MSYS2/pacman install step for matrix.target == 'i386-win32', a Windows 32-bit build using the MSYS2 shell and 32-bit MinGW GCC, and preserves the existing Windows 64-bit build path for other Windows targets.

Changes

Cohort / File(s) Summary
CI Workflow Windows Build
.github/workflows/ci.yml
Replaced a Windows-only "Build FFI fixture library" step with target-aware logic: for matrix.target == 'i386-win32' install mingw-w64-i686-gcc via MSYS2/pacman and run the 32-bit build in msys2 {0} shell; retain the original gcc -shared step for non-i386 Windows targets (runner.os == 'Windows' && matrix.target != 'i386-win32').

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~8 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically describes the main change: building a 32-bit FFI fixture DLL on Windows CI, which aligns with the primary objective of the changeset.
Description check ✅ Passed The description covers the Summary section well and provides Testing verification, though it notes 'Not run' rather than completing all testing checkboxes as specified in the template.
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.

- Use MSYS2 MINGW32 for the 32-bit Windows fixture DLL
- Split Windows 32-bit and 64-bit build steps
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 8, 2026

Benchmark Results

274 benchmarks

Interpreted: 🟢 233 improved · 🔴 10 regressed · 31 unchanged · avg +7.8%
Bytecode: 🟢 162 improved · 🔴 36 regressed · 76 unchanged · avg +3.6%

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

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 8, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 3891 3891
Tests Passed 3850 ✅ 3891 ✅
Tests Skipped 41 0
Tests Test Duration 265.5ms 243.8ms
Tests Lex 74.4ms 46.2ms
Tests Parse 93.8ms 89.7ms
Tests Compile 53.9ms
Tests Execute 281.0ms 268.8ms
Tests Engine Total 449.1ms 458.6ms
Benchmarks Total 274 274
Benchmarks Duration 7.31min 6.62min

Measured on ubuntu-latest x64.

@frostney frostney merged commit 0433eca into main Apr 8, 2026
54 checks passed
@frostney frostney deleted the t3code/win32-ffi-fix branch April 8, 2026 16:18
@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