Skip to content

Suppress CLI output from worker threads#307

Merged
frostney merged 2 commits intomainfrom
t3code/cli-parallel-execution-fixes
Apr 15, 2026
Merged

Suppress CLI output from worker threads#307
frostney merged 2 commits intomainfrom
t3code/cli-parallel-execution-fixes

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Apr 15, 2026

Summary

  • Added a thread-local GIsWorkerThread flag to identify work running inside TGocciaThreadPool workers.
  • Guarded WriteLn calls in ScriptLoader, TestRunner, and BenchmarkRunner so worker threads no longer write directly to shared console output.
  • Suppressed parser warnings, human-readable result printing, and test assertion output on worker threads to avoid interleaved or corrupted terminal output.
  • Kept file/error reporting behavior intact by still recording failures in structured results while skipping direct console writes from workers.

Testing

  • Review the updated worker-thread guards in ScriptLoader.dpr, TestRunner.dpr, and BenchmarkRunner.dpr.
  • Confirm GIsWorkerThread is set during worker initialization in units/Goccia.Threading.pas.

- Skip direct WriteLn calls on TGocciaThreadPool workers
- Suppress warnings and test assertion output in parallel runs
- Mark worker threads with GIsWorkerThread
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 15, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 7bc1ce44-43d7-4dce-a811-ebf483dce432

📥 Commits

Reviewing files that changed from the base of the PR and between 69b6c37 and 6a46801.

📒 Files selected for processing (4)
  • BenchmarkRunner.dpr
  • ScriptLoader.dpr
  • TestRunner.dpr
  • units/Goccia.Threading.pas

📝 Walkthrough

Walkthrough

Introduces a thread-local flag GIsWorkerThread to identify worker thread contexts and conditionally suppresses console output (WriteLn, warnings, error messages) across BenchmarkRunner, ScriptLoader, and TestRunner when executing in worker threads. File-based error reporting remains unaffected.

Changes

Cohort / File(s) Summary
Thread Worker Flag Declaration
units/Goccia.Threading.pas
New exported threadvar GIsWorkerThread: Boolean with documentation noting thread-safety concerns for concurrent WriteLn operations. Flag is set during InitThreadRuntime.
Exception Handler Output Suppression
BenchmarkRunner.dpr
Wrapped WriteLn(StdErr, ...) calls in exception handlers (TGocciaError, TGocciaThrowValue, EGocciaBytecodeThrow) with if not GIsWorkerThread guards.
Comprehensive Worker Thread Output Control
ScriptLoader.dpr
Suppressed parser warnings, disabled console output, enabled engine warning suppression, prevented human-readable result printing, and wrapped error-reporting logic—all conditionally when GIsWorkerThread is true.
Test Execution Output Suppression
TestRunner.dpr
Added Goccia.Builtins.TestAssertions import; suppressed per-file error messages, exception details, and parser warnings in worker threads; enabled silent test console and assertion output suppression for worker execution.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested labels

bug

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Suppress CLI output from worker threads' directly and clearly describes the main change across all modified files.
Description check ✅ Passed The description covers the key changes, implementation approach, and testing verification, though it deviates from the template's checkbox format for testing section.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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

@coderabbitai coderabbitai Bot added the bug Something isn't working label Apr 15, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 15, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 5358 5358
Tests Passed 5317 ✅ 5358 ✅
Tests Skipped 41 0
Tests Test Duration 938.3ms 751.7ms
Tests Lex 248.7ms 136.0ms
Tests Parse 250.2ms 226.6ms
Tests Compile 140.6ms
Tests Execute 975.7ms 816.3ms
Tests Engine Total 1.47s 1.32s
Benchmarks Total 364 364
Benchmarks Duration 8.30min 8.30min

Measured on ubuntu-latest x64.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 15, 2026

Benchmark Results

364 benchmarks

Interpreted: 🟢 29 improved · 🔴 265 regressed · 70 unchanged · avg -2.5%
Bytecode: 🟢 293 improved · 🔴 23 regressed · 48 unchanged · avg +10.3%

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

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.

- Keep worker console silencing without touching TGocciaTestAssertions.SuppressOutput
- Document the x86_64-darwin -O4 hang caused by the inlined property access
@frostney frostney merged commit 8263d7c into main Apr 15, 2026
54 checks passed
@frostney frostney deleted the t3code/cli-parallel-execution-fixes branch April 15, 2026 11:41
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