Skip to content

fix(intl): delegate locale prototype methods#700

Draft
frostney wants to merge 2 commits into
mainfrom
issue-605-intl-locale-prototypes
Draft

fix(intl): delegate locale prototype methods#700
frostney wants to merge 2 commits into
mainfrom
issue-605-intl-locale-prototypes

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Jun 2, 2026

Summary

  • Add Intl-aware Number.prototype.toLocaleString, Array.prototype.toLocaleString, and Date toLocaleString / toLocaleDateString / toLocaleTimeString behavior through the default shim layer.
  • Capture the Intl formatter constructors at shim initialization so later global Intl.*Format mutations do not affect the prototype methods.
  • Update Array built-ins documentation and add focused end-to-end coverage.

Closes #605

Testing

  • Verified no regressions and confirmed the new feature or bugfix in end-to-end JavaScript/TypeScript tests
  • Updated documentation
  • 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

Commands run:

  • ./build.pas loader testrunner loaderbare
  • ./build/GocciaTestRunner tests/built-ins/Number/prototype/toLocaleString.js tests/built-ins/Array/prototype/toLocaleString.js tests/built-ins/Date/prototype/toLocaleString.js tests/built-ins/Date/prototype/toLocaleDateString.js tests/built-ins/Date/prototype/toLocaleTimeString.js --no-progress --exit-on-first-failure
  • ./build/GocciaTestRunner tests/built-ins/Number/prototype/toLocaleString.js tests/built-ins/Array/prototype/toLocaleString.js tests/built-ins/Date/prototype/toLocaleString.js tests/built-ins/Date/prototype/toLocaleDateString.js tests/built-ins/Date/prototype/toLocaleTimeString.js --mode=bytecode --no-progress --exit-on-first-failure
  • bun scripts/run_test262_suite.ts --suite-dir /tmp/goccia-test262-605 --categories intl402 --filter 'intl402/Array/prototype/toLocaleString/**' --mode bytecode --jobs 1 --verbose (2/2 pass)
  • bun scripts/run_test262_suite.ts --suite-dir /tmp/goccia-test262-605 --categories intl402 --filter 'intl402/Number/prototype/toLocaleString/**' --mode bytecode --jobs 1 --verbose (6/7 pass; remaining exception-equivalence failure matches existing Intl exception metadata limitations)
  • bun scripts/run_test262_suite.ts --suite-dir /tmp/goccia-test262-605 --categories intl402 --filter 'intl402/Date/prototype/**' --mode bytecode --jobs 1 --verbose (11/12 pass; remaining exception-equivalence failure matches existing Intl exception metadata limitations)
  • ./format.pas --check
  • git diff --check
  • ./build/GocciaTestRunner tests --no-progress (9854/9859 pass; remaining failures are FFI fixture loads for ./fixtures/ffi/libfixture.dylib)

Implement Intl-aware Number, Array, and Date toLocale* prototype methods via the default shim layer.

Closes #605
@vercel
Copy link
Copy Markdown

vercel Bot commented Jun 2, 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 Jun 2, 2026 8:20pm

Request Review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Jun 2, 2026

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: d7f01730-0b12-4340-8239-3c251ef102b3

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

Suite Timing

Test Runner (interpreted: 9,897 passed; bytecode: 9,897 passed)
Metric Interpreted Bytecode
Total 9897 9897
Passed 9897 ✅ 9897 ✅
Workers 4 4
Test Duration 3.51s 4.11s
Lex (cumulative) 417.3ms 433.6ms
Parse (cumulative) 303.5ms 316.5ms
Compile (cumulative) 633.2ms
Execute (cumulative) 3.73s 4.92s
Engine Total (cumulative) 4.46s 6.31s
Lex (avg/worker) 104.3ms 108.4ms
Parse (avg/worker) 75.9ms 79.1ms
Compile (avg/worker) 158.3ms
Execute (avg/worker) 933.7ms 1.23s
Engine Total (avg/worker) 1.11s 1.58s

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 290.82 MiB 283.22 MiB
GC Peak Live 290.83 MiB 283.23 MiB
GC Allocated During Run 296.88 MiB 289.28 MiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 1 1
GC Collected Objects 93 93
Heap Start Allocated 161.2 KiB 161.2 KiB
Heap End Allocated 1.61 MiB 1.61 MiB
Heap Delta Allocated 1.45 MiB 1.45 MiB
Heap Delta Free 945.8 KiB 945.8 KiB
Benchmarks (interpreted: 407; bytecode: 407)
Metric Interpreted Bytecode
Total 407 407
Workers 4 4
Duration 2.38min 2.34min

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 4.02 MiB 4.02 MiB
GC Peak Live 120.17 MiB 83.77 MiB
GC Allocated During Run 14.53 GiB 9.40 GiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 2,809 2,659
GC Collected Objects 229,901,956 210,494,567
Heap Start Allocated 1.34 MiB 1.34 MiB
Heap End Allocated 1.34 MiB 1.34 MiB
Heap Delta Allocated 128 B 128 B

Measured on ubuntu-latest x64.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

Benchmark Results

407 benchmarks

Interpreted: 🟢 5 improved · 🔴 400 regressed · 2 unchanged · avg -28.3%
Bytecode: 🟢 33 improved · 🔴 312 regressed · 62 unchanged · avg -7.2%

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

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 Jun 2, 2026

test262 Conformance

🚫 Regression vs cached main baseline. 2 previously-passing test(s) now fail; pass count Δ +33. This run blocks merge — see "Newly failing" below.

Category Run Passed Δ Pass Failed Pass-rate Δ Rate
built-ins 23,449 16,096 +20 7,348 68.6% +0.1pp
harness 116 72 ±0 44 62.1% ±0pp
intl402 3,324 1,011 +11 2,313 30.4% +0.3pp
language 23,635 14,631 ±0 9,004 61.9% ±0pp
staging 1,484 578 +2 904 38.9% +0.1pp
total 52,008 32,388 +33 19,613 62.3% +0.1pp

Areas closest to 100%

Area Pass rate Δ vs main Passing
built-ins/WeakMap 99.3% ±0pp 140 / 141
language/asi 99.0% ±0pp 101 / 102
built-ins/WeakSet 98.8% ±0pp 84 / 85
Per-test deltas (+35 / -2)

Newly failing (2):

  • built-ins/Array/prototype/toLocaleString/user-provided-tolocalestring-grow.js
  • intl402/TypedArray/prototype/toLocaleString/calls-toLocaleString-number-elements.js

Newly passing (35):

  • built-ins/Array/prototype/toLocaleString/prop-desc.js
  • built-ins/Array/prototype/toLocaleString/S15.4.4.3_A1_T1.js
  • built-ins/Array/prototype/toLocaleString/S15.4.4.3_A3_T1.js
  • built-ins/Date/prototype/S15.9.5_A05_T1.js
  • built-ins/Date/prototype/S15.9.5_A06_T1.js
  • built-ins/Date/prototype/S15.9.5_A07_T1.js
  • built-ins/Date/prototype/toLocaleDateString/length.js
  • built-ins/Date/prototype/toLocaleDateString/name.js
  • built-ins/Date/prototype/toLocaleDateString/prop-desc.js
  • built-ins/Date/prototype/toLocaleString/prop-desc.js
  • built-ins/Date/prototype/toLocaleTimeString/length.js
  • built-ins/Date/prototype/toLocaleTimeString/name.js
  • built-ins/Date/prototype/toLocaleTimeString/prop-desc.js
  • built-ins/Number/prototype/S15.7.4_A3.3.js
  • built-ins/Number/prototype/toExponential/undefined-fractiondigits.js
  • built-ins/Number/prototype/toLocaleString/prop-desc.js
  • built-ins/Object/getOwnPropertyDescriptor/15.2.3.3-4-152.js
  • built-ins/Object/getOwnPropertyDescriptor/15.2.3.3-4-158.js
  • built-ins/Object/getOwnPropertyDescriptor/15.2.3.3-4-159.js
  • built-ins/Object/getOwnPropertyDescriptor/15.2.3.3-4-51.js
  • built-ins/Object/getOwnPropertyDescriptor/15.2.3.3-4-90.js
  • intl402/Array/prototype/toLocaleString/invoke-element-tolocalestring.js
  • intl402/Date/prototype/returns-same-results-as-DateTimeFormat.js
  • intl402/Date/prototype/taint-Intl-DateTimeFormat.js
  • intl402/Date/prototype/this-value-invalid-date.js
  • intl402/Date/prototype/this-value-non-date.js
  • intl402/Date/prototype/toLocaleDateString/builtin.js
  • intl402/Date/prototype/toLocaleDateString/length.js
  • intl402/Date/prototype/toLocaleTimeString/builtin.js
  • intl402/Date/prototype/toLocaleTimeString/length.js
  • intl402/Number/prototype/toLocaleString/returns-same-results-as-NumberFormat.js
  • intl402/Number/prototype/toLocaleString/this-number-value.js
  • intl402/NumberFormat/prototype/format/units.js
  • staging/sm/Array/toLocaleString-01.js
  • staging/sm/Function/redefine-arguments-length.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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Intl: Number/Date/Array toLocaleString methods not Intl-aware

1 participant