Skip to content

Handle EOF before REPL prompt on Windows#385

Merged
frostney merged 1 commit into
mainfrom
t3code/fix-bun-windows-tests
Apr 22, 2026
Merged

Handle EOF before REPL prompt on Windows#385
frostney merged 1 commit into
mainfrom
t3code/fix-bun-windows-tests

Conversation

@frostney
Copy link
Copy Markdown
Owner

Summary

  • Add an EOF guard in the REPL line editor on non-UNIX platforms before writing the prompt.
  • Return lrExit immediately when Input is already at EOF, instead of attempting to read a line.
  • Clear the current line buffer in the EOF path to keep REPL state consistent.

Testing

  • Not run (change is a small targeted fix in the REPL line editor).
  • Verified by code review that the new branch only affects the non-UNIX prompt path before ReadLn.

- Return `lrExit` immediately when stdin is already at EOF on non-UNIX builds
- Avoid writing the prompt or blocking on `ReadLn` after input is closed
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 22, 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: 51bfe0dc-e1d6-4d5f-a424-146ee8daedcf

📥 Commits

Reviewing files that changed from the base of the PR and between 99fba02 and 11c2562.

📒 Files selected for processing (1)
  • source/units/Goccia.REPL.LineEditor.pas

📝 Walkthrough

Walkthrough

A bug fix for TLineEditor.ReadLine on non-UNIX platforms that adds an early exit condition when EOF is detected on the input stream, returning an empty line and lrExit status before attempting to read input.

Changes

Cohort / File(s) Summary
EOF Detection
source/units/Goccia.REPL.LineEditor.pas
Added EOF check before prompting for input on non-UNIX platforms; returns early with lrExit and empty string if EOF is detected, preventing read operations on exhausted input streams.

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~3 minutes

Suggested labels

bug

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically describes the main change: handling EOF detection before the REPL prompt on Windows platforms.
Description check ✅ Passed The description covers the main change and testing approach, but omits the Testing section structure with checkboxes and does not link any related issues.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ 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 22, 2026
@github-actions
Copy link
Copy Markdown
Contributor

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 7527 7527
Tests Passed 7486 ✅ 7527 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 1.51s 1.50s
Tests Lex (cumulative) 195.9ms 120.7ms
Tests Parse (cumulative) 275.9ms 281.6ms
Tests Compile (cumulative) 177.9ms
Tests Execute (cumulative) 1.64s 1.54s
Tests Engine Total (cumulative) 2.12s 2.12s
Tests Lex (avg/worker) 49.0ms 30.2ms
Tests Parse (avg/worker) 69.0ms 70.4ms
Tests Compile (avg/worker) 44.5ms
Tests Execute (avg/worker) 410.8ms 384.8ms
Tests Engine Total (avg/worker) 528.8ms 529.8ms
Benchmarks Total 386 386
Benchmarks Workers 4 4
Benchmarks Duration 2.91min 2.80min

Measured on ubuntu-latest x64.

@github-actions
Copy link
Copy Markdown
Contributor

Benchmark Results

386 benchmarks

Interpreted: 🟢 10 improved · 🔴 343 regressed · 33 unchanged · avg -8.6%
Bytecode: 🟢 72 improved · 🔴 58 regressed · 256 unchanged · avg -0.5%

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

Measured on ubuntu-latest x64. Benchmark ranges compare cached main-branch min/max ops/sec with the PR run; overlapping ranges are treated as unchanged noise. Percentage deltas are secondary context.

@frostney frostney merged commit 99d4f58 into main Apr 22, 2026
56 checks passed
@frostney frostney deleted the t3code/fix-bun-windows-tests branch April 22, 2026 19:33
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