Skip to content

Handle iterable and array-like arguments in TypedArray constructor, from(), and set()#558

Merged
frostney merged 3 commits into
mainfrom
issue-551-typedarray-iterable-arraylike
May 7, 2026
Merged

Handle iterable and array-like arguments in TypedArray constructor, from(), and set()#558
frostney merged 3 commits into
mainfrom
issue-551-typedarray-iterable-arraylike

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented May 6, 2026

Summary

  • Add ES2026 §23.2.5.1 steps 5d-f to new TypedArray(object): check @@iterator (iterable path) then fall back to array-like (LengthOfArrayLike + indexed GetProperty)
  • Add ES2026 §23.2.2.1 steps 5-7 to TypedArray.from(source): iterable path with mapfn support, then array-like path via ToObject + LengthOfArrayLike
  • Add ES2026 §23.2.3.25.2 SetTypedArrayFromArrayLike to TypedArray.prototype.set(): replace TypeError with array-like path via ToObject + LengthOfArrayLike

Test plan

  • Verified both reproduction cases from issue produce correct output (1 instead of 0)
  • 220 targeted TypedArray tests pass (constructor, from, set) including 30 new tests for iterable/array-like paths
  • Full test suite passes (8722/8727, 5 pre-existing FFI failures unrelated)
  • Format check clean
  • Swimmies advisory docs reviewed (value-system.md, built-ins-binary-data.md) — no conflicts

Closes #551

🤖 Generated with Claude Code

…rom(), and set() (#551)

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

vercel Bot commented May 6, 2026

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

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
gocciascript-homepage Ignored Ignored Preview May 7, 2026 10:54am

Request Review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 6, 2026

Review Change Stack
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: e50e8c88-5d52-46d3-a221-9bd057f01c0c

📥 Commits

Reviewing files that changed from the base of the PR and between 4b1ed0f and 5e7d585.

📒 Files selected for processing (1)
  • source/units/Goccia.Values.TypedArrayValue.pas
✅ Files skipped from review due to trivial changes (1)
  • source/units/Goccia.Values.TypedArrayValue.pas

📝 Walkthrough

Walkthrough

Extends TypedArray constructor, TypedArray.from, and TypedArray.prototype.set to accept iterables and array-like objects per ES2026: prefer @@iterator iteration, otherwise use ToObject + LengthOfArrayLike + indexed reads; adds tests for constructors, from, and set behaviors.

Changes

TypedArray Iterable and Array-Like Construction Support

Layer / File(s) Summary
Imports & Iterator Support
source/units/Goccia.Values.TypedArrayValue.pas
Import declarations expanded to include iterator utilities and ToObject for array-like coercion.
TypedArray.prototype.set array-like fallback
source/units/Goccia.Values.TypedArrayValue.pas
TypedArraySet now accepts non-typed-array/non-array sources by coercing to object and copying via LengthOfArrayLike and indexed GetProperty reads.
TypedArray constructor iterable & array-like paths
source/units/Goccia.Values.TypedArrayValue.pas
CreateNativeInstance handles object inputs by iterating if @@iterator exists (collect values) or falling back to ToObject + LengthOfArrayLike + indexed reads.
TypedArray.from iterable handling
source/units/Goccia.Values.TypedArrayValue.pas
TypedArrayFrom collects values from an iterator via GetIteratorFromValue, then creates destination typed array and applies optional mapfn.
TypedArray.from array-like handling
source/units/Goccia.Values.TypedArrayValue.pas
TypedArrayFrom falls back to ToObject + LengthOfArrayLike + indexed GetProperty reads, applying optional mapfn per element.
Constructor tests
tests/built-ins/TypedArray/constructors.js
Added new TypedArray(iterable) tests: custom iterable, Set, Map.value/keys iterators, empty iterable, BigInt iterable.
TypedArray.from tests
tests/built-ins/TypedArray/from.js
Inserted from iterable tests covering custom iterables, Set, mapFn behavior and index argument, empty iterables, and Map.values.
Prototype set tests
tests/built-ins/TypedArray/prototype/set.js
Added tests for set from array-like objects: offset handling, empty sources, oversized input and offset overflow errors.

Sequence Diagram(s)

sequenceDiagram
  participant Source
  participant Iterator
  participant Collector
  participant TypedArray
  Source->>Iterator: Get @@iterator / GetIteratorFromValue
  alt iterable
    Iterator->>Collector: next() -> value
    Collector->>TypedArray: allocate(length) / apply mapfn / write values
  else array-like
    Source->>Source: ToObject / LengthOfArrayLike
    Source->>TypedArray: Get indexed properties -> apply mapfn -> write
  end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • frostney/GocciaScript#383: Touches ToObject/LengthOfArrayLike and iterator-aware helpers that align with the iterable/array-like support here.
  • frostney/GocciaScript#365: Modifies TypedArray constructor/from paths and BigInt TypedArray handling, overlapping implementation areas.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically summarizes the main change: adding support for iterable and array-like arguments across three TypedArray methods.
Description check ✅ Passed The description covers all required sections: Summary with linked issue, Testing with checkmarks for verification steps, and demonstrates spec compliance with ES2026 references.
Linked Issues check ✅ Passed The PR fully implements the requirements from issue #551: iterable path via @@iterator detection, array-like fallback via LengthOfArrayLike and indexed Get, and applies fixes to constructor, from(), and set() methods.
Out of Scope Changes check ✅ Passed All changes are directly scoped to the linked issue #551: implementation of iterable and array-like handling in TypedArray methods, plus comprehensive test coverage for these scenarios.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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

Warning

Review ran into problems

🔥 Problems

Git: Failed to clone repository. Please run the @coderabbitai full review command to re-trigger a full review. If the issue persists, set path_filters to include or exclude specific files.


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

@coderabbitai coderabbitai Bot added bug Something isn't working new feature New feature or request spec compliance Mismatch against official JavaScript/TypeScript specification labels May 6, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 6, 2026

Suite Timing

Test Runner (interpreted: 8,844 passed; bytecode: 8,844 passed)
Metric Interpreted Bytecode
Total 8844 8844
Passed 8844 ✅ 8844 ✅
Workers 4 4
Test Duration 2.21s 1.90s
Lex (cumulative) 257.1ms 147.8ms
Parse (cumulative) 278.4ms 241.8ms
Compile (cumulative) 509.3ms
Execute (cumulative) 2.23s 1.66s
Engine Total (cumulative) 2.76s 2.56s
Lex (avg/worker) 64.3ms 37.0ms
Parse (avg/worker) 69.6ms 60.4ms
Compile (avg/worker) 127.3ms
Execute (avg/worker) 557.3ms 416.0ms
Engine Total (avg/worker) 691.2ms 640.7ms

Memory

GC rows aggregate the main thread plus all worker thread-local GCs. Test runner worker shutdown frees thread-local heaps in bulk; that shutdown reclamation is not counted as GC collections or collected objects.

Metric Interpreted Bytecode
GC Live 212.99 MiB 207.69 MiB
GC Peak Live 213.00 MiB 207.70 MiB
GC Allocated During Run 217.32 MiB 211.97 MiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 1 1
GC Collected Objects 74 74
Heap Start Allocated 144.7 KiB 144.7 KiB
Heap End Allocated 1.37 MiB 1.37 MiB
Heap Delta Allocated 1.23 MiB 1.23 MiB
Heap Delta Free 470.8 KiB 470.8 KiB
Benchmarks (interpreted: 407; bytecode: 407)
Metric Interpreted Bytecode
Total 407 407
Workers 4 4
Duration 2.50min 2.32min

Memory

GC rows aggregate the main thread plus all worker thread-local GCs. Benchmark runner performs explicit between-file collections, so collection and collected-object counts can be much higher than the test runner.

Metric Interpreted Bytecode
GC Live 3.23 MiB 3.23 MiB
GC Peak Live 103.79 MiB 63.20 MiB
GC Allocated During Run 13.84 GiB 9.20 GiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 2,827 2,644
GC Collected Objects 257,216,195 217,095,651
Heap Start Allocated 1.13 MiB 1.13 MiB
Heap End Allocated 1.13 MiB 1.13 MiB
Heap Delta Allocated 128 B 128 B

Measured on ubuntu-latest x64.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 6, 2026

Benchmark Results

407 benchmarks

Interpreted: 🟢 12 improved · 🔴 233 regressed · 162 unchanged · avg -2.7%
Bytecode: 🟢 42 improved · 🔴 120 regressed · 245 unchanged · avg -0.5%

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

Deterministic profile diff

Deterministic profile diff: no significant changes.

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.

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: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@source/units/Goccia.Values.TypedArrayValue.pas`:
- Around line 2116-2138: The iterator consumption block that builds Values from
Iterator (using GetIteratorFromValue, Iterator.AdvanceNext and
IterResult.GetProperty) must be wrapped with try/except so that on any exception
you call CloseIteratorPreservingError (and for the raw-iterator path call
CloseRawIteratorPreservingError) before re-raising; specifically, change the
flow around TGocciaValueList creation /
TGarbageCollector.Instance.AddTempRoot(Iterator) / Iterator.AdvanceNext loop to
catch exceptions, call the appropriate Close*PreservingError helper with the
Iterator, ensure TGarbageCollector.Instance.RemoveTempRoot(Iterator) still runs,
then re-raise the original exception, and apply the same pattern to the other
iterable path that eventually creates TGocciaTypedArrayValue and uses
WriteValueToElement.
- Around line 2113-2148: The iterable detection (GetIteratorFromValue/Iterator
handling) must run before the TGocciaArrayValue/TGocciaTypedArrayValue
fast-paths so an object with an overridden Symbol.iterator wins; move the block
that calls GetIteratorFromValue and iterates (using Iterator.AdvanceNext /
PROP_DONE / PROP_VALUE into Values) to precede any type-check branches for
TGocciaArrayValue and TGocciaTypedArrayValue, then keep the
array-like/LengthOfArrayLike fallback after those iterator and fast-path checks;
apply the same reordering for the other occurrence around the code that spans
the later block (the similar section at the referenced second location).
🪄 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: f9d916d2-6f04-4b0d-8599-1f1cf7304852

📥 Commits

Reviewing files that changed from the base of the PR and between b671ad1 and fc4bccd.

📒 Files selected for processing (4)
  • source/units/Goccia.Values.TypedArrayValue.pas
  • tests/built-ins/TypedArray/constructors.js
  • tests/built-ins/TypedArray/from.js
  • tests/built-ins/TypedArray/prototype/set.js

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

github-actions Bot commented May 6, 2026

test262 Conformance

Category Run Passed Δ Pass Failed Pass-rate Δ Rate
built-ins 23,448 14,286 +173 9,161 60.9% +0.7pp
harness 116 69 ±0 47 59.5% ±0pp
intl402 3,324 167 ±0 3,157 5.0% ±0pp
language 23,635 12,174 ±0 11,461 51.5% ±0pp
staging 1,483 466 +1 1,015 31.4% +0.1pp
total 52,006 27,162 +174 24,841 52.2% +0.3pp

Areas closest to 100%

Area Pass rate Δ vs main Passing
built-ins/WeakSet 98.8% ±0pp 84 / 85
built-ins/WeakMap 98.6% ±0pp 139 / 141
language/asi 97.1% ±0pp 99 / 102
Per-test deltas (+174 / -0)

Newly passing (174):

  • built-ins/Number/prototype/toExponential/undefined-fractiondigits.js
  • built-ins/TypedArray/from/iterated-array-changed-by-tonumber.js
  • built-ins/TypedArray/prototype/at/index-argument-tointeger.js
  • built-ins/TypedArray/prototype/at/index-non-numeric-argument-tointeger.js
  • built-ins/TypedArray/prototype/at/returns-item-relative-index.js
  • built-ins/TypedArray/prototype/at/returns-item.js
  • built-ins/TypedArray/prototype/at/returns-undefined-for-holes-in-sparse-arrays.js
  • built-ins/TypedArray/prototype/byteLength/return-bytelength.js
  • built-ins/TypedArray/prototype/every/BigInt/callbackfn-return-does-not-change-instance.js
  • built-ins/TypedArray/prototype/every/callbackfn-return-does-not-change-instance.js
  • built-ins/TypedArray/prototype/every/callbackfn-returns-abrupt.js
  • built-ins/TypedArray/prototype/every/callbackfn-this.js
  • built-ins/TypedArray/prototype/every/returns-false-if-any-cb-returns-false.js
  • built-ins/TypedArray/prototype/fill/fill-values-conversion-once.js
  • built-ins/TypedArray/prototype/fill/fill-values-non-numeric.js
  • built-ins/TypedArray/prototype/filter/callbackfn-return-does-not-change-instance.js
  • built-ins/TypedArray/prototype/filter/callbackfn-returns-abrupt.js
  • built-ins/TypedArray/prototype/filter/callbackfn-this.js
  • built-ins/TypedArray/prototype/find/BigInt/return-found-value-predicate-result-is-true.js
  • built-ins/TypedArray/prototype/find/predicate-call-this-strict.js
  • built-ins/TypedArray/prototype/find/return-abrupt-from-predicate-call.js
  • built-ins/TypedArray/prototype/find/return-found-value-predicate-result-is-true.js
  • built-ins/TypedArray/prototype/find/return-undefined-if-predicate-returns-false-value.js
  • built-ins/TypedArray/prototype/findIndex/BigInt/return-index-predicate-result-is-true.js
  • built-ins/TypedArray/prototype/findIndex/BigInt/return-negative-one-if-predicate-returns-false-value.js
  • built-ins/TypedArray/prototype/findIndex/predicate-call-this-strict.js
  • built-ins/TypedArray/prototype/findIndex/return-abrupt-from-predicate-call.js
  • built-ins/TypedArray/prototype/findIndex/return-index-predicate-result-is-true.js
  • built-ins/TypedArray/prototype/findIndex/return-negative-one-if-predicate-returns-false-value.js
  • built-ins/TypedArray/prototype/findLast/BigInt/return-found-value-predicate-result-is-true.js
  • built-ins/TypedArray/prototype/findLast/predicate-call-this-strict.js
  • built-ins/TypedArray/prototype/findLast/return-abrupt-from-predicate-call.js
  • built-ins/TypedArray/prototype/findLast/return-found-value-predicate-result-is-true.js
  • built-ins/TypedArray/prototype/findLast/return-undefined-if-predicate-returns-false-value.js
  • built-ins/TypedArray/prototype/findLastIndex/BigInt/return-index-predicate-result-is-true.js
  • built-ins/TypedArray/prototype/findLastIndex/BigInt/return-negative-one-if-predicate-returns-false-value.js
  • built-ins/TypedArray/prototype/findLastIndex/predicate-call-this-strict.js
  • built-ins/TypedArray/prototype/findLastIndex/return-abrupt-from-predicate-call.js
  • built-ins/TypedArray/prototype/findLastIndex/return-index-predicate-result-is-true.js
  • built-ins/TypedArray/prototype/findLastIndex/return-negative-one-if-predicate-returns-false-value.js
  • built-ins/TypedArray/prototype/forEach/callbackfn-return-does-not-change-instance.js
  • built-ins/TypedArray/prototype/forEach/callbackfn-returns-abrupt.js
  • built-ins/TypedArray/prototype/forEach/callbackfn-this.js
  • built-ins/TypedArray/prototype/includes/BigInt/fromIndex-minus-zero.js
  • built-ins/TypedArray/prototype/includes/BigInt/return-abrupt-tointeger-fromindex-symbol.js
  • built-ins/TypedArray/prototype/includes/BigInt/return-abrupt-tointeger-fromindex.js
  • built-ins/TypedArray/prototype/includes/BigInt/search-found-returns-true.js
  • built-ins/TypedArray/prototype/includes/BigInt/tointeger-fromindex.js
  • built-ins/TypedArray/prototype/includes/fromIndex-minus-zero.js
  • built-ins/TypedArray/prototype/includes/return-abrupt-tointeger-fromindex-symbol.js
  • built-ins/TypedArray/prototype/includes/return-abrupt-tointeger-fromindex.js
  • built-ins/TypedArray/prototype/includes/samevaluezero.js
  • built-ins/TypedArray/prototype/includes/search-found-returns-true.js
  • built-ins/TypedArray/prototype/includes/tointeger-fromindex.js
  • built-ins/TypedArray/prototype/indexOf/BigInt/fromIndex-minus-zero.js
  • built-ins/TypedArray/prototype/indexOf/BigInt/search-found-returns-index.js
  • built-ins/TypedArray/prototype/indexOf/BigInt/tointeger-fromindex.js
  • built-ins/TypedArray/prototype/indexOf/fromIndex-minus-zero.js
  • built-ins/TypedArray/prototype/indexOf/return-abrupt-tointeger-fromindex-symbol.js
  • built-ins/TypedArray/prototype/indexOf/return-abrupt-tointeger-fromindex.js
  • built-ins/TypedArray/prototype/indexOf/search-found-returns-index.js
  • built-ins/TypedArray/prototype/indexOf/tointeger-fromindex.js
  • built-ins/TypedArray/prototype/join/BigInt/custom-separator-result-from-tostring-on-each-simple-value.js
  • built-ins/TypedArray/prototype/join/BigInt/result-from-tostring-on-each-simple-value.js
  • built-ins/TypedArray/prototype/join/custom-separator-result-from-tostring-on-each-simple-value.js
  • built-ins/TypedArray/prototype/join/result-from-tostring-on-each-simple-value.js
  • built-ins/TypedArray/prototype/lastIndexOf/BigInt/fromIndex-minus-zero.js
  • built-ins/TypedArray/prototype/lastIndexOf/BigInt/search-found-returns-index.js
  • built-ins/TypedArray/prototype/lastIndexOf/BigInt/tointeger-fromindex.js
  • built-ins/TypedArray/prototype/lastIndexOf/fromIndex-minus-zero.js
  • built-ins/TypedArray/prototype/lastIndexOf/return-abrupt-tointeger-fromindex-symbol.js
  • built-ins/TypedArray/prototype/lastIndexOf/return-abrupt-tointeger-fromindex.js
  • built-ins/TypedArray/prototype/lastIndexOf/search-found-returns-index.js
  • built-ins/TypedArray/prototype/lastIndexOf/tointeger-fromindex.js
  • built-ins/TypedArray/prototype/length/return-length.js
  • built-ins/TypedArray/prototype/map/BigInt/callbackfn-return-affects-returned-object.js
  • built-ins/TypedArray/prototype/map/BigInt/callbackfn-return-does-not-copy-non-integer-properties.js
  • built-ins/TypedArray/prototype/map/callbackfn-return-affects-returned-object.js
  • built-ins/TypedArray/prototype/map/callbackfn-return-does-not-change-instance.js
  • built-ins/TypedArray/prototype/map/callbackfn-return-does-not-copy-non-integer-properties.js
  • built-ins/TypedArray/prototype/map/callbackfn-returns-abrupt.js
  • built-ins/TypedArray/prototype/map/callbackfn-this.js
  • built-ins/TypedArray/prototype/map/return-new-typedarray-from-positive-length.js
  • built-ins/TypedArray/prototype/reduce/BigInt/callbackfn-return-does-not-change-instance.js
  • built-ins/TypedArray/prototype/reduce/BigInt/result-of-any-type.js
  • built-ins/TypedArray/prototype/reduce/BigInt/return-first-value-without-callbackfn.js
  • built-ins/TypedArray/prototype/reduce/callbackfn-return-does-not-change-instance.js
  • built-ins/TypedArray/prototype/reduce/callbackfn-returns-abrupt.js
  • built-ins/TypedArray/prototype/reduce/callbackfn-this.js
  • built-ins/TypedArray/prototype/reduce/result-of-any-type.js
  • built-ins/TypedArray/prototype/reduce/return-first-value-without-callbackfn.js
  • built-ins/TypedArray/prototype/reduceRight/BigInt/callbackfn-return-does-not-change-instance.js
  • built-ins/TypedArray/prototype/reduceRight/BigInt/result-of-any-type.js
  • built-ins/TypedArray/prototype/reduceRight/BigInt/return-first-value-without-callbackfn.js
  • built-ins/TypedArray/prototype/reduceRight/callbackfn-return-does-not-change-instance.js
  • built-ins/TypedArray/prototype/reduceRight/callbackfn-returns-abrupt.js
  • built-ins/TypedArray/prototype/reduceRight/callbackfn-this.js
  • built-ins/TypedArray/prototype/reduceRight/result-of-any-type.js
  • built-ins/TypedArray/prototype/reduceRight/return-first-value-without-callbackfn.js
  • built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-get-length.js
  • … 74 more

Steady-state failures are non-blocking; regressions vs the cached main baseline (lower total pass count, or any PASS → non-PASS transition) fail the conformance gate. Measured on ubuntu-latest x64, bytecode mode. Areas grouped by the first two test262 path components; minimum 25 attempted tests, areas already at 100% excluded. Δ vs main compares against the most recent cached main baseline.

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.

♻️ Duplicate comments (2)
source/units/Goccia.Values.TypedArrayValue.pas (2)

2104-2116: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

TGocciaArrayValue fast path still sits before the @@iterator check — spec ordering not restored.

Per ES2026 §23.2.5.1, step 5a (GetMethod(firstArgument, @@iterator)) applies to all objects, including plain arrays. The current layout exits at line 2110 for any TGocciaArrayValue input, so an array with an overridden Symbol.iterator will always use Elements directly and never reach the iterable path at line 2116.

The TGocciaTypedArrayValue, TGocciaArrayBufferValue, and TGocciaSharedArrayBufferValue fast paths are spec-defined steps that correctly precede the iterator check; the TGocciaArrayValue fast path is not.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@source/units/Goccia.Values.TypedArrayValue.pas` around lines 2104 - 2116, The
TGocciaArrayValue fast path is placed before the @@iterator check so arrays with
a custom Symbol.iterator never invoke the iterable branch; move the
TGocciaArrayValue handling (the block that creates TGocciaTypedArrayValue from
SrcArr.Elements) to after the GetMethod/GetIteratorFromValue check (i.e. after
the code that calls GetIteratorFromValue and handles iterables) so that
GetMethod(firstArgument, @@iterator) runs for all objects (matching ES2026
§23.2.5.1 step 5a); keep the existing fast paths for TGocciaTypedArrayValue,
TGocciaArrayBufferValue, and TGocciaSharedArrayBufferValue before the iterator
check as they are spec-allowed.

2218-2265: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Same spec ordering gap in TypedArrayFrom: both fast paths sit before the @@iterator check.

Per ES2026 §23.2.2.1, step 5 (GetMethod(source, @@iterator)) fires before any source-type dispatch — even for TGocciaTypedArrayValue sources (typed arrays expose Symbol.iterator via the shared prototype registered at line 624). The TGocciaTypedArrayValue fast path at line 2218 and the TGocciaArrayValue fast path at line 2241 both exit before the iterator check at line 2265.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@source/units/Goccia.Values.TypedArrayValue.pas` around lines 2218 - 2265, The
fast-paths in TypedArrayFrom run before the spec-required iterator check; move
the iterator detection (call to GetIteratorFromValue(Source) and the handling of
a non-nil Iterator) so it executes before the TGocciaTypedArrayValue and
TGocciaArrayValue branches in TypedArrayFrom; in practice: call
GetIteratorFromValue(Source) first, if it returns a non-nil Iterator take the
iterable path, otherwise fall through to the existing typed-array fast path
(TGocciaTypedArrayValue) and then the regular array fast path
(TGocciaArrayValue) as currently implemented.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Duplicate comments:
In `@source/units/Goccia.Values.TypedArrayValue.pas`:
- Around line 2104-2116: The TGocciaArrayValue fast path is placed before the
@@iterator check so arrays with a custom Symbol.iterator never invoke the
iterable branch; move the TGocciaArrayValue handling (the block that creates
TGocciaTypedArrayValue from SrcArr.Elements) to after the
GetMethod/GetIteratorFromValue check (i.e. after the code that calls
GetIteratorFromValue and handles iterables) so that GetMethod(firstArgument,
@@iterator) runs for all objects (matching ES2026 §23.2.5.1 step 5a); keep the
existing fast paths for TGocciaTypedArrayValue, TGocciaArrayBufferValue, and
TGocciaSharedArrayBufferValue before the iterator check as they are
spec-allowed.
- Around line 2218-2265: The fast-paths in TypedArrayFrom run before the
spec-required iterator check; move the iterator detection (call to
GetIteratorFromValue(Source) and the handling of a non-nil Iterator) so it
executes before the TGocciaTypedArrayValue and TGocciaArrayValue branches in
TypedArrayFrom; in practice: call GetIteratorFromValue(Source) first, if it
returns a non-nil Iterator take the iterable path, otherwise fall through to the
existing typed-array fast path (TGocciaTypedArrayValue) and then the regular
array fast path (TGocciaArrayValue) as currently implemented.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 37d6414b-c0e3-4b1e-b10d-465af39741a6

📥 Commits

Reviewing files that changed from the base of the PR and between fc4bccd and 4b1ed0f.

📒 Files selected for processing (1)
  • source/units/Goccia.Values.TypedArrayValue.pas

In the constructor, move the TGocciaArrayValue fast path after the
@@iterator check so arrays with overridden Symbol.iterator use the
iterable branch (§23.2.5.1 step 5c). In from(), move the iterator
detection before the TypedArray and Array fast paths (§23.2.2.1 step 5).
The fast paths remain as fallbacks for sources without @@iterator.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@frostney frostney merged commit 4d82a23 into main May 7, 2026
14 checks passed
@frostney frostney deleted the issue-551-typedarray-iterable-arraylike branch May 7, 2026 14:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working new feature New feature or request spec compliance Mismatch against official JavaScript/TypeScript specification

Projects

None yet

Development

Successfully merging this pull request may close these issues.

TypedArray constructor does not handle iterable and array-like arguments

1 participant