Skip to content

Fix Array.prototype.slice for high-index array-like values#411

Merged
frostney merged 4 commits into
mainfrom
t3code/verify-implement-409
Apr 27, 2026
Merged

Fix Array.prototype.slice for high-index array-like values#411
frostney merged 4 commits into
mainfrom
t3code/verify-implement-409

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Apr 26, 2026

Summary

  • Fixed Array.prototype.slice so generic array-like objects with indices above 2**31 are handled without collapsing the slice window.
  • Switched the slice copy path to use 64-bit index accessors when the computed start index exceeds MaxInt.
  • Added regression tests covering high start indexes, sparse results, and empty slices for large array-like objects.

Fixes #409

- Preserve slices that start above the 32-bit index range
- Add tests for sparse array-like objects with lengths over 2**31
@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 26, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
gocciascript-homepage Ready Ready Preview, Comment Apr 27, 2026 10:18am

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 26, 2026

📝 Walkthrough

Walkthrough

TGocciaArrayValue.ArraySlice now chooses between an Integer-indexed dense copy and an Int64-indexed sparse copy when the computed slice end (RawFinal) can exceed MaxInt; tests added for slicing array‑like objects with length > 2**31.

Changes

Cohort / File(s) Summary
ArraySlice implementation
source/units/Goccia.Values.ArrayValue.pas
Adjusted TGocciaArrayValue.ArraySlice to branch on RawFinal > MaxInt: use an Int64 source counter with View.HasIndex64/View.Get64 for large-index sparse copying, otherwise use the prior Integer-bounded dense iteration. Preserves clamping and hole semantics.
Slice prototype tests
tests/built-ins/Array/prototype/slice.js
Added tests exercising Array.prototype.slice.call on generic array-like receivers with length > 2**31, covering very large positive/negative starts/ends, boundary crossing near 2**31-1, sparse hole behavior, and empty-slice cases.

Sequence Diagram(s)

(omitted)

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related issues

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Description check ❓ Inconclusive The pull request description covers the summary section with a clear explanation of the fix and references the related issue, but does not include evidence of testing verification. Add explicit testing checklist items (marked complete) to document which tests were verified and confirm no regressions were observed.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title directly addresses the main fix: handling Array.prototype.slice for high-index array-like values, which accurately summarizes the primary change.
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 spec compliance Mismatch against official JavaScript/TypeScript specification label Apr 26, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@source/units/Goccia.Values.ArrayValue.pas`:
- Around line 1725-1742: The current branch decision only uses RawK > MaxInt and
misses cases where StartIndex + Needed overflows the 32-bit Integer range;
update the branching so the 64-bit path (using View.HasIndex64 / View.Get64 /
ArrayCreateDataProperty with 64-bit indices) is chosen whenever RawK > MaxInt OR
the computed end index would exceed MaxInt (e.g. Int64(Trunc(RawK)) + Needed >
MaxInt) or when EndIndex would be greater than View.Len; compute the end as a
64-bit value to check bounds safely and, if it crosses the 32-bit boundary,
iterate via the 64-bit loop (mirroring the RawK > MaxInt branch) to avoid
integer overflow and missing high indices while still clamping against View.Len.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 60939614-c2b7-4008-8244-7ed8ab0129fa

📥 Commits

Reviewing files that changed from the base of the PR and between 7e90fd0 and 11b9a63.

📒 Files selected for processing (2)
  • source/units/Goccia.Values.ArrayValue.pas
  • tests/built-ins/Array/prototype/slice.js

Comment thread source/units/Goccia.Values.ArrayValue.pas Outdated
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 26, 2026

Benchmark Results

386 benchmarks

Interpreted: 🟢 12 improved · 🔴 350 regressed · 24 unchanged · avg -8.1%
Bytecode: 🟢 20 improved · 🔴 326 regressed · 40 unchanged · avg -6.9%

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

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 26, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 7843 7843
Tests Passed 7802 ✅ 7843 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 1.71s 1.80s
Tests Lex (cumulative) 194.2ms 124.0ms
Tests Parse (cumulative) 287.5ms 283.7ms
Tests Compile (cumulative) 181.9ms
Tests Execute (cumulative) 1.46s 1.62s
Tests Engine Total (cumulative) 1.94s 2.21s
Tests Lex (avg/worker) 48.5ms 31.0ms
Tests Parse (avg/worker) 71.9ms 70.9ms
Tests Compile (avg/worker) 45.5ms
Tests Execute (avg/worker) 363.9ms 405.4ms
Tests Engine Total (avg/worker) 484.3ms 552.8ms
Benchmarks Total 386 386
Benchmarks Workers 4 4
Benchmarks Duration 2.93min 2.83min

Measured on ubuntu-latest x64.

The previous guard (RawK > MaxInt) missed the case where start equals
MaxInt and the window crosses past it, causing an Integer overflow in
StartIndex + Needed with overflow checks enabled. Branching on RawFinal
instead catches all windows that touch indices beyond Integer range.
Also derives EndIndex from RawFinal directly to avoid the addition.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
tests/built-ins/Array/prototype/slice.js (1)

176-183: Test name is misleading — no negative end index is used.

The test name says "high negative end" but the test uses positive indices (high and high + 2). Consider renaming to reflect the actual scenario being tested.

📝 Suggested name fix
-test("slice on generic array-like with high negative end", () => {
+test("slice on generic array-like with multiple high indices", () => {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/built-ins/Array/prototype/slice.js` around lines 176 - 183, The test
title is misleading — it references a "high negative end" while the test
actually calls Array.prototype.slice with large positive indices (variables high
and high + 2); update the test description string in the test(...) call to
accurately reflect the scenario (e.g., "slice on generic array-like with high
positive indices" or "slice on generic array-like with large positive
start/end") so the name matches the use of Array.prototype.slice and the
variables high and high + 1.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@tests/built-ins/Array/prototype/slice.js`:
- Around line 176-183: The test title is misleading — it references a "high
negative end" while the test actually calls Array.prototype.slice with large
positive indices (variables high and high + 2); update the test description
string in the test(...) call to accurately reflect the scenario (e.g., "slice on
generic array-like with high positive indices" or "slice on generic array-like
with large positive start/end") so the name matches the use of
Array.prototype.slice and the variables high and high + 1.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2f32b45c-d5f2-43e6-a5e3-6aabe0f5fbbc

📥 Commits

Reviewing files that changed from the base of the PR and between 11b9a63 and c78af59.

📒 Files selected for processing (2)
  • source/units/Goccia.Values.ArrayValue.pas
  • tests/built-ins/Array/prototype/slice.js

- Clarify the test name for large positive start and end indices
- Cover `Array.prototype.slice` on generic array-like objects above `2**31`
- Verify negative start and end positions preserve tail elements
@frostney frostney merged commit 736b397 into main Apr 27, 2026
58 checks passed
@frostney frostney deleted the t3code/verify-implement-409 branch April 27, 2026 10:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

spec compliance Mismatch against official JavaScript/TypeScript specification

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ArraySlice: add sparse-path for high-start windows on generic array-likes (RawLen > MaxInt)

1 participant