Skip to content

Update ECMAScript edition references to 2027#323

Merged
frostney merged 5 commits into
mainfrom
t3code/update-es-editions
Apr 17, 2026
Merged

Update ECMAScript edition references to 2027#323
frostney merged 5 commits into
mainfrom
t3code/update-es-editions

Conversation

@frostney
Copy link
Copy Markdown
Owner

Summary

  • Update repository-wide ECMAScript references from 2026/2025-era wording to the current 2027 framing.
  • Simplify built-in docs by removing proposal/stage labels where the implementation is now treated as standard or documenting it more generically.
  • Drop jobCount and parallel-timing reporting from TestRunner/BenchmarkRunner outputs and the CI checks that asserted those fields.
  • Align the spec fixture and README language with the new edition references.

Testing

  • Not run (documentation and reporting cleanup only).
  • Not run: ./build.pas testrunner && ./build/TestRunner tests
  • Not run: ./format.pas --check

- Refresh built-in and language docs to remove stale edition labels
- Move features into the new ES2026/ES2027 tables and adjust proposal stage wording
- Add coverage for 2026 and 2027 entries in the Goccia spec tests
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 17, 2026

📝 Walkthrough

Walkthrough

Updated docs, language tables, and the internal ES feature catalog to add ES2026/ES2027 and WHATWG APIs, reclassify proposal-stage language to standard/spec references, bump README tagline to “ECMAScript 2027+”, update unit spec catalogs, and update tests to expect new year keys.

Changes

Cohort / File(s) Summary
Top-level README
README.md
Changed tagline from “ECMAScript 2026+” to “ECMAScript 2027+`.
Built-ins docs
docs/built-ins.md, docs/built-ins-binary-data.md, docs/built-ins-temporal.md
Removed proposal/TC39/edition-specific phrasing, updated links and wording for BinaryData, Temporal, RegExp, Math, and related built-ins.
Language feature tables & narrative
docs/language-tables.md, docs/language.md
Extended feature range to ES2027, moved/promoted multiple features to ES2026/ES2027, added a Web Platform APIs (WHATWG/W3C) section, and updated per-feature headings/links and TC39 proposal table.
Documentation style guidance
docs/contributing/code-style.md
Added guidance on when to use edition year vs proposal stage in built-in docs and where to record edition years.
Spec catalog & tests
units/Goccia.Spec.pas, tests/built-ins/Goccia/spec.js
Reworked ES feature catalogs (added ES2026, ES2027, WHATWG_FEATURES), adjusted proposal stage lists, exposed new read-only properties ('2026', '2027', 'whatwg', 'stage-2'), and updated test to assert presence of 2026 and 2027 keys.
Other docs
docs/built-ins-*.md, docs/* (various)
Minor wording and citation cleanups across built-in documentation to remove edition suffixes or proposal-stage labels where appropriate.

Sequence Diagram(s)

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • Restructure built-in registration #286: Modifies spec/proposal machinery and Goccia.spec metadata—directly related to the unit catalog and property exposure changes in units/Goccia.Spec.pas.
🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Description check ❓ Inconclusive The description covers the main changes but the Testing section shows no tests were run, which conflicts with the template's checkbox requirements for verification. Clarify whether testing requirements have been waived or provide evidence of verification performed. Update the Testing section to indicate the rationale for skipping tests or provide actual test results.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately and concisely describes the main change: updating ECMAScript edition references to 2027, which is reflected throughout all modified files.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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


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

@coderabbitai coderabbitai Bot added documentation Improvements or additions to documentation spec compliance Mismatch against official JavaScript/TypeScript specification labels Apr 17, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 17, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 5391 5391
Tests Passed 5350 ✅ 5391 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 801.4ms 804.9ms
Tests Lex (cumulative) 226.7ms 156.6ms
Tests Parse (cumulative) 230.3ms 252.4ms
Tests Compile (cumulative) 153.8ms
Tests Execute (cumulative) 845.2ms 901.1ms
Tests Engine Total (cumulative) 1.30s 1.46s
Tests Lex (avg/worker) 56.7ms 39.2ms
Tests Parse (avg/worker) 57.6ms 63.1ms
Tests Compile (avg/worker) 38.5ms
Tests Execute (avg/worker) 211.3ms 225.3ms
Tests Engine Total (avg/worker) 325.5ms 366.0ms
Benchmarks Total 364 364
Benchmarks Workers 4 4
Benchmarks Duration 2.91min 2.57min

Measured on ubuntu-latest x64.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 17, 2026

Benchmark Results

364 benchmarks

Interpreted: 🟢 19 improved · 🔴 276 regressed · 69 unchanged · avg -3.9%
Bytecode: 🟢 114 improved · 🔴 30 regressed · 220 unchanged · avg +1.3%

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

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

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

🧹 Nitpick comments (1)
units/Goccia.Spec.pas (1)

173-183: ES2026 feature list looks complete and consistent.

The ES2026_FEATURES array correctly captures the promoted features. Note that docs/language-tables.md lists both Map.prototype.getOrInsert and getOrInsertComputed on line 65, but only getOrInsert appears in the Name field here. Consider whether the entry name should be updated to Map.prototype.getOrInsert/getOrInsertComputed or if a separate entry is needed — or if the current single entry is intentionally representing both methods under one umbrella.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@units/Goccia.Spec.pas` around lines 173 - 183, ES2026_FEATURES currently
lists a single entry (Map.prototype.getOrInsert) but docs/language-tables.md
mentions both Map.prototype.getOrInsert and getOrInsertComputed; update the
ES2026_FEATURES entry to clearly reflect both methods by renaming the Name field
to "Map.prototype.getOrInsert / getOrInsertComputed" or add a separate feature
entry for getOrInsertComputed as appropriate; locate the ES2026_FEATURES array
and modify the tuple with Name: 'Map.prototype.getOrInsert' (or add a new tuple)
so the feature list matches the docs and unambiguously represents both methods.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/built-ins.md`:
- Line 415: Update the Iterator documentation phrase that currently reads "Stage
3 Joint Iteration proposal" to remove the stage label; replace it with a concise
term like "Joint Iteration" (or "Joint Iteration proposal") so the sentence
reads consistently with the rest of the docs alongside "ECMAScript Iterator
Helpers", "Iterator.concat", and "Iterator.zip".
- Line 72: The docs entry for Math.clamp still includes the "Stage 2" proposal
label; update the built-ins listing so Math.clamp is documented consistently
with the PR goal by removing the "(Stage 2 [proposal-math-clamp]...)" suffix and
keeping only "| `Math.clamp(x, min, max)` | Clamp to range |" (i.e., remove the
proposal/stage annotation for Math.clamp to match the other simplified built-in
entries).

In `@docs/language-tables.md`:
- Line 59: The docs entry listing `atob` / `btoa` as "ES2026" is incorrect;
update the ES2026 language table row for `atob` / `btoa` so it no longer claims
ECMAScript support: either remove the row from the ES2026 table entirely or
change its label to indicate WHATWG/Non-Standard. Reference the implementation
in units/Goccia.Builtins.Globals.pas and ensure the table note clarifies these
functions follow the WHATWG HTML spec rather than any ECMAScript edition.

---

Nitpick comments:
In `@units/Goccia.Spec.pas`:
- Around line 173-183: ES2026_FEATURES currently lists a single entry
(Map.prototype.getOrInsert) but docs/language-tables.md mentions both
Map.prototype.getOrInsert and getOrInsertComputed; update the ES2026_FEATURES
entry to clearly reflect both methods by renaming the Name field to
"Map.prototype.getOrInsert / getOrInsertComputed" or add a separate feature
entry for getOrInsertComputed as appropriate; locate the ES2026_FEATURES array
and modify the tuple with Name: 'Map.prototype.getOrInsert' (or add a new tuple)
so the feature list matches the docs and unambiguously represents both methods.
🪄 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: 8bba8584-cd37-44e7-8310-0302356b9b8b

📥 Commits

Reviewing files that changed from the base of the PR and between 43e7c0d and 43fed12.

📒 Files selected for processing (9)
  • README.md
  • docs/built-ins-binary-data.md
  • docs/built-ins-temporal.md
  • docs/built-ins.md
  • docs/contributing/code-style.md
  • docs/language-tables.md
  • docs/language.md
  • tests/built-ins/Goccia/spec.js
  • units/Goccia.Spec.pas

Comment thread docs/built-ins.md
Comment thread docs/built-ins.md
Comment thread docs/language-tables.md Outdated
frostney and others added 2 commits April 17, 2026 13:51
These are WHATWG HTML spec APIs, not ECMAScript standard. The
implementation already annotates them as "WHATWG HTML spec §8.3".
Move the row after all ES edition entries.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Move structuredClone and atob/btoa out of the ECMAScript table
  (they are WHATWG/W3C, not ECMA-262)
- Add new "Web Platform APIs" section to language-tables.md with all
  10 WHATWG/W3C APIs: console, structuredClone, DOMException, atob/btoa,
  queueMicrotask, URL, URLSearchParams, TextEncoder, TextDecoder,
  performance
- Add WHATWG_FEATURES array to Goccia.Spec.pas and expose it on the
  Goccia.spec object as the 'whatwg' key

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.

Actionable comments posted: 3

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

Inline comments:
In `@docs/language-tables.md`:
- Around line 77-79: The table row for `DOMException` has a link to the Web IDL
spec but the visible label reads "HTML §4.3"; update the visible label to
accurately reference Web IDL (e.g., "Web IDL §4.3" or the correct Web IDL
section title) by editing the `DOMException` table row so the link text matches
the link target.

In `@units/Goccia.Spec.pas`:
- Around line 195-205: The WHATWG_FEATURES entry uses the Pascalized
"Performance" instead of the actual runtime/global API name; update the Name
field in the WHATWG_FEATURES array (TGocciaFeatureEntry) from 'Performance' to
'performance' so the table matches the exposed global API and documentation
(look for the tuple with Link
'https://w3c.github.io/hr-time/#dom-performance-now' inside WHATWG_FEATURES).
- Around line 173-183: The ES2026_FEATURES array in units/Goccia.Spec.pas only
lists 'Map.prototype.getOrInsert' but the docs state both 'getOrInsert' and
'getOrInsertComputed' are supported; update the ES2026_FEATURES constant (the
ES2026_FEATURES: array[0..8] of TGocciaFeatureEntry) to include a second entry
for 'Map.prototype.getOrInsertComputed' (with the appropriate spec link,
matching the existing Link pattern) so the runtime metadata and docs are
consistent.
🪄 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: a430edec-8e5c-4a73-ae6c-06b7425a3b25

📥 Commits

Reviewing files that changed from the base of the PR and between 43fed12 and 933ac45.

📒 Files selected for processing (2)
  • docs/language-tables.md
  • units/Goccia.Spec.pas

Comment thread docs/language-tables.md
Comment thread units/Goccia.Spec.pas
Comment thread units/Goccia.Spec.pas
- DOMException: label was "HTML §4.3" but link pointed to Web IDL spec;
  relabel to "Web IDL"
- Map upsert: Goccia.Spec.pas only listed getOrInsert but both
  getOrInsert and getOrInsertComputed are implemented; sync with docs

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)
docs/language-tables.md (1)

57-58: ⚠️ Potential issue | 🟡 Minor

Keep these ES2020 rows in sync with Goccia.spec['2020'].

The table now documents import.meta and dynamic import(), but units/Goccia.Spec.pas still exposes only the original five ES2020 entries. Until those metadata rows are added there too, the docs and Goccia.spec will disagree.

#!/bin/bash
# Verify whether import.meta and dynamic import() are documented but absent from Goccia.spec metadata.
rg -n -C2 'import\.meta|import\(\)|ES2020_FEATURES' docs/language-tables.md units/Goccia.Spec.pas

Expected result: docs/language-tables.md contains both ES2020 rows, while units/Goccia.Spec.pas has no matching ES2020_FEATURES entries.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/language-tables.md` around lines 57 - 58, The docs add ES2020 rows for
`import.meta` and dynamic `import()` but `Goccia.spec['2020']` in
units/Goccia.Spec.pas still lacks those metadata entries; update the ES2020
feature list (look for the `ES2020_FEATURES` / `Goccia.spec['2020']` definition
in units/Goccia.Spec.pas) to include entries for `import.meta` and `import()`
with the same supported status/details used in docs so the spec and docs remain
in sync.
units/Goccia.Spec.pas (1)

161-168: ⚠️ Potential issue | 🟡 Minor

Add Math.f16round to the ES2025 catalog.

Goccia.spec['2025'] now advertises only Float16Array, but the repo’s own docs treat Float16Array and Math.f16round as the ES2025 pair. That leaves the public metadata incomplete.

#!/bin/bash
# Verify that Math.f16round is documented/implemented as ES2025 but omitted from Goccia.spec metadata.
rg -n -C2 'Math\.f16round|Float16Array|ES2025_FEATURES' docs/language-tables.md units/Goccia.Builtins.Math.pas units/Goccia.Spec.pas

Expected result: docs/language-tables.md and units/Goccia.Builtins.Math.pas show both Float16Array and Math.f16round, while units/Goccia.Spec.pas lists only Float16Array in ES2025_FEATURES.

Based on learnings: In frostney/GocciaScript, Math.f16round and Float16Array are ES2025 features (ECMAScript 16th edition, June 2025).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@units/Goccia.Spec.pas` around lines 161 - 168, The ES2025_FEATURES array in
Goccia.Spec.pas is missing the Math.f16round entry; update the ES2025_FEATURES
(TGocciaFeatureEntry) to include a new entry with Name: 'Math.f16round' and an
appropriate Link (e.g. the ecma262 Math.f16round section), and expand the array
bounds from [0..5] to [0..6] so the Float16Array and Math.f16round pair are both
listed for ES2025.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In `@docs/language-tables.md`:
- Around line 57-58: The docs add ES2020 rows for `import.meta` and dynamic
`import()` but `Goccia.spec['2020']` in units/Goccia.Spec.pas still lacks those
metadata entries; update the ES2020 feature list (look for the `ES2020_FEATURES`
/ `Goccia.spec['2020']` definition in units/Goccia.Spec.pas) to include entries
for `import.meta` and `import()` with the same supported status/details used in
docs so the spec and docs remain in sync.

In `@units/Goccia.Spec.pas`:
- Around line 161-168: The ES2025_FEATURES array in Goccia.Spec.pas is missing
the Math.f16round entry; update the ES2025_FEATURES (TGocciaFeatureEntry) to
include a new entry with Name: 'Math.f16round' and an appropriate Link (e.g. the
ecma262 Math.f16round section), and expand the array bounds from [0..5] to
[0..6] so the Float16Array and Math.f16round pair are both listed for ES2025.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: c2e28701-caf3-433c-8213-96b51d06cd97

📥 Commits

Reviewing files that changed from the base of the PR and between 933ac45 and a05a679.

📒 Files selected for processing (2)
  • docs/language-tables.md
  • units/Goccia.Spec.pas

- Add ES2020 entries for `import.meta` and dynamic `import()`
- Add `Math.f16round` to the ES2025 feature list
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
units/Goccia.Spec.pas (1)

285-297: Consider adding fixture coverage for the new non-year keys.

CreateSpecObject now exposes whatwg, and CreateProposalObject now exposes stage-2. A small assertion for both would help keep these public keys from drifting in future metadata reshuffles.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@units/Goccia.Spec.pas` around lines 285 - 297, The test fixtures lack
assertions for the new non-year keys added to the spec objects: update the
relevant tests to assert that CreateSpecObject exposes the 'whatwg' key and
CreateProposalObject exposes the 'stage-2' key; locate the object construction
using CreateSpecObject and CreateProposalObject (where DefineReadOnlyProperty is
called with 'whatwg' and 'stage-2', and CreateFeatureArray is used) and add
small assertions that those properties exist and contain the expected array
shape/value so future metadata reshuffles will break tests instead of drifting.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@units/Goccia.Spec.pas`:
- Around line 285-297: The test fixtures lack assertions for the new non-year
keys added to the spec objects: update the relevant tests to assert that
CreateSpecObject exposes the 'whatwg' key and CreateProposalObject exposes the
'stage-2' key; locate the object construction using CreateSpecObject and
CreateProposalObject (where DefineReadOnlyProperty is called with 'whatwg' and
'stage-2', and CreateFeatureArray is used) and add small assertions that those
properties exist and contain the expected array shape/value so future metadata
reshuffles will break tests instead of drifting.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a5e9ac8b-f0b9-4e0f-9771-ec4bcaa4a90e

📥 Commits

Reviewing files that changed from the base of the PR and between a05a679 and 0be9f19.

📒 Files selected for processing (1)
  • units/Goccia.Spec.pas

@frostney frostney merged commit c6e5e5c into main Apr 17, 2026
10 checks passed
@frostney frostney deleted the t3code/update-es-editions branch April 17, 2026 14:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation spec compliance Mismatch against official JavaScript/TypeScript specification

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant