Skip to content

Fix Intl format and compare accessors#686

Merged
frostney merged 2 commits into
mainfrom
issue-604-intl-accessor-format-compare
May 29, 2026
Merged

Fix Intl format and compare accessors#686
frostney merged 2 commits into
mainfrom
issue-604-intl-accessor-format-compare

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented May 29, 2026

Summary

  • Register Intl.NumberFormat.prototype.format, Intl.DateTimeFormat.prototype.format, and Intl.Collator.prototype.compare as accessor properties with undefined setters.
  • Cache anonymous bound functions in internal value fields so detached callbacks work without exposing own format/compare properties.
  • Align single-value Intl formatting defaults with ECMA-402 and current engine behavior: NumberFormat formats omitted/undefined as NaN, while DateTimeFormat formats omitted/undefined dates using the current time.
  • Add end-to-end Intl tests for descriptor shape, cached getter results, distinct instance functions, detached callback behavior, and default-argument semantics.
  • Closes Intl: format and compare should be getter accessors, not data properties #604.

Testing

  • Verified no regressions and confirmed the new feature or bugfix in end-to-end JavaScript/TypeScript tests
    • ./build.pas testrunner && ./build/GocciaTestRunner tests
    • ./build/GocciaTestRunner tests/built-ins/Intl
    • ./build/GocciaTestRunner tests/built-ins/Intl/NumberFormat/prototype/format.js
    • ./build/GocciaTestRunner tests/built-ins/Intl/NumberFormat/prototype/formatToParts.js
    • ./build/GocciaTestRunner tests/built-ins/Intl/DateTimeFormat/prototype/format.js
    • ./build/GocciaTestRunner tests/built-ins/Intl/DateTimeFormat/prototype/formatToParts.js
    • ./format.pas --check
  • Updated documentation
    • Runtime conformance fix only; no user-facing docs changed.
  • Optional: Verified no regressions and confirmed the new feature or bugfix in native Pascal tests (if AST, scope, evaluator, or value types changed)
  • Optional: Verified no benchmark regressions or confirmed benchmark coverage for the change

@vercel
Copy link
Copy Markdown

vercel Bot commented May 29, 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 29, 2026 6:22am

Request Review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 29, 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: adff55f0-b07e-4658-8cf8-90afca0e6127

📥 Commits

Reviewing files that changed from the base of the PR and between 4f95508 and eef0c3c.

📒 Files selected for processing (8)
  • source/units/Goccia.Values.IntlCollator.pas
  • source/units/Goccia.Values.IntlDateTimeFormat.pas
  • source/units/Goccia.Values.IntlNumberFormat.pas
  • tests/built-ins/Intl/Collator/prototype/compare.js
  • tests/built-ins/Intl/DateTimeFormat/prototype/format.js
  • tests/built-ins/Intl/DateTimeFormat/prototype/formatToParts.js
  • tests/built-ins/Intl/NumberFormat/prototype/format.js
  • tests/built-ins/Intl/NumberFormat/prototype/formatToParts.js

📝 Walkthrough

Walkthrough

This PR converts three Intl built-in properties—Intl.Collator.prototype.compare, Intl.DateTimeFormat.prototype.format, and Intl.NumberFormat.prototype.format—from data properties to accessor properties. Each now returns a cached bound function on access, with GC-safe reference tracking and comprehensive test coverage for the new behavior.

Changes

Intl accessor property conversion for format and compare

Layer / File(s) Summary
IntlCollator accessor and bound function
source/units/Goccia.Values.IntlCollator.pas
TGocciaIntlCollatorValue gains a cached FBoundCompare field and MarkReferences override. New TGocciaIntlCollatorBoundCompareValue wrapper class delegates Compare calls back to the collator. Prototype initialization registers compare as an accessor via IntlCollatorCompareGetter instead of a named method, and collator settings are applied within the getter and compare logic.
IntlDateTimeFormat accessor and bound function
source/units/Goccia.Values.IntlDateTimeFormat.pas
TGocciaIntlDateTimeFormatValue gains a cached FBoundFormat field, MarkReferences override, and new helpers to treat omitted/undefined date arguments as "now" (current epoch milliseconds). New TGocciaIntlDateTimeFormatBoundFormatValue wrapper delegates Format calls to the owner. Prototype initialization registers format as an accessor via IntlDateTimeFormatFormatGetter. Both format and formatToParts use the new argument-milliseconds conversion logic.
IntlNumberFormat accessor and bound function
source/units/Goccia.Values.IntlNumberFormat.pas
TGocciaIntlNumberFormatValue gains a cached FBoundFormat field and MarkReferences override. New TGocciaIntlNumberFormatBoundFormatValue wrapper delegates Format calls to the owner. Prototype initialization registers format as an accessor via IntlNumberFormatFormatGetter. Explicit argument-length validation is removed from format and formatToParts methods.
Accessor property and bound function tests
tests/built-ins/Intl/Collator/prototype/compare.js, tests/built-ins/Intl/DateTimeFormat/prototype/format.js, tests/built-ins/Intl/DateTimeFormat/prototype/formatToParts.js, tests/built-ins/Intl/NumberFormat/prototype/format.js, tests/built-ins/Intl/NumberFormat/prototype/formatToParts.js
New test files verify accessor property descriptors (getter present, non-enumerable, configurable), per-instance function caching (same function on repeated access, non-own property), instance isolation, correct behavior for omitted/undefined date/numeric arguments, and RangeError handling for invalid inputs.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Suggested labels

spec compliance, bug, internal

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Fix Intl format and compare accessors' directly summarizes the main change: converting Intl format/compare properties from data properties to accessor getters.
Description check ✅ Passed The description comprehensively covers the PR objectives, implementation approach, testing verification, and links the relevant issue. All template sections are addressed with substantive content.
Linked Issues check ✅ Passed All coding requirements from issue #604 are met: accessor properties registered for format/compare [#604], cached bound functions in internal fields [#604], correct property descriptors without value/setter [#604], and comprehensive Intl test coverage [#604].
Out of Scope Changes check ✅ Passed All changes directly support the issue #604 requirements: implementation files convert properties to accessors, test files verify descriptor shape and caching behavior, and argument-handling refinements align NumberFormat/DateTimeFormat with spec defaults.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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


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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 29, 2026

Benchmark Results

407 benchmarks

Interpreted: 🟢 162 improved · 🔴 18 regressed · 227 unchanged · avg +3.5%
Bytecode: 🟢 30 improved · 🔴 315 regressed · 62 unchanged · avg -7.4%

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

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.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 29, 2026

Suite Timing

Test Runner (interpreted: 9,814 passed; bytecode: 9,814 passed)
Metric Interpreted Bytecode
Total 9814 9814
Passed 9814 ✅ 9814 ✅
Workers 4 4
Test Duration 3.10s 3.41s
Lex (cumulative) 458.1ms 401.4ms
Parse (cumulative) 306.2ms 278.2ms
Compile (cumulative) 571.0ms
Execute (cumulative) 2.91s 4.39s
Engine Total (cumulative) 3.67s 5.64s
Lex (avg/worker) 114.5ms 100.3ms
Parse (avg/worker) 76.6ms 69.6ms
Compile (avg/worker) 142.8ms
Execute (avg/worker) 726.8ms 1.10s
Engine Total (avg/worker) 917.8ms 1.41s

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 281.54 MiB 275.77 MiB
GC Peak Live 281.55 MiB 275.78 MiB
GC Allocated During Run 286.04 MiB 280.27 MiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 1 1
GC Collected Objects 87 87
Heap Start Allocated 159.4 KiB 159.4 KiB
Heap End Allocated 1.53 MiB 1.53 MiB
Heap Delta Allocated 1.37 MiB 1.37 MiB
Heap Delta Free 448.4 KiB 448.4 KiB
Benchmarks (interpreted: 407; bytecode: 407)
Metric Interpreted Bytecode
Total 407 407
Workers 4 4
Duration 2.40min 2.45min

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.93 MiB 3.93 MiB
GC Peak Live 91.07 MiB 85.96 MiB
GC Allocated During Run 13.38 GiB 9.88 GiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 2,818 2,661
GC Collected Objects 242,565,379 229,013,025
Heap Start Allocated 1.27 MiB 1.27 MiB
Heap End Allocated 1.27 MiB 1.27 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 29, 2026

test262 Conformance

Category Run Passed Δ Pass Failed Pass-rate Δ Rate
built-ins 23,449 16,067 +1 7,377 68.5% ±0pp
harness 116 72 ±0 44 62.1% ±0pp
intl402 3,324 957 +22 2,367 28.8% +0.7pp
language 23,635 14,433 ±0 9,202 61.1% ±0pp
staging 1,484 571 ±0 910 38.5% ±0pp
total 52,008 32,100 +23 19,900 61.7% ±0pp

Areas closest to 100%

Area Pass rate Δ vs main Passing
built-ins/WeakMap 99.3% ±0pp 140 / 141
built-ins/WeakSet 98.8% ±0pp 84 / 85
language/future-reserved-words 98.1% ±0pp 53 / 54
Per-test deltas (+23 / -0)

Newly passing (23):

  • built-ins/Number/prototype/toExponential/undefined-fractiondigits.js
  • intl402/Collator/prototype/compare/builtin.js
  • intl402/Collator/prototype/compare/compare-function-name.js
  • intl402/Collator/prototype/compare/length.js
  • intl402/Collator/prototype/compare/name.js
  • intl402/Collator/prototype/compare/prop-desc.js
  • intl402/DateTimeFormat/prototype/format/bound-to-datetimeformat-instance.js
  • intl402/DateTimeFormat/prototype/format/builtin.js
  • intl402/DateTimeFormat/prototype/format/format-function-name.js
  • intl402/DateTimeFormat/prototype/format/length.js
  • intl402/DateTimeFormat/prototype/format/name.js
  • intl402/DateTimeFormat/prototype/format/no-instanceof.js
  • intl402/DateTimeFormat/prototype/format/prop-desc.js
  • intl402/DateTimeFormat/prototype/format/taint-Object-prototype.js
  • intl402/DateTimeFormat/prototype/formatToParts/main.js
  • intl402/NumberFormat/prototype/format/bound-to-numberformat-instance.js
  • intl402/NumberFormat/prototype/format/builtin.js
  • intl402/NumberFormat/prototype/format/default-value.js
  • intl402/NumberFormat/prototype/format/format-function-name.js
  • intl402/NumberFormat/prototype/format/length.js
  • intl402/NumberFormat/prototype/format/name.js
  • intl402/NumberFormat/prototype/format/no-instanceof.js
  • intl402/NumberFormat/prototype/format/prop-desc.js

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.

Align Intl.NumberFormat format/formatToParts with ToNumber(undefined) semantics and Intl.DateTimeFormat format/formatToParts with the Date.now default for omitted or undefined dates.
@frostney frostney marked this pull request as ready for review May 29, 2026 14:19
@coderabbitai coderabbitai Bot added bug Something isn't working spec compliance Mismatch against official JavaScript/TypeScript specification internal Refactoring, CI, tooling, cleanup labels May 29, 2026
@frostney frostney merged commit 40cad0e into main May 29, 2026
14 checks passed
@frostney frostney deleted the issue-604-intl-accessor-format-compare branch May 29, 2026 14:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working internal Refactoring, CI, tooling, cleanup spec compliance Mismatch against official JavaScript/TypeScript specification

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Intl: format and compare should be getter accessors, not data properties

1 participant