Skip to content

fix(intl): parse Locale unicode extension keys#696

Merged
frostney merged 1 commit into
mainfrom
issue-601-intl-locale-unicode-extensions
Jun 2, 2026
Merged

fix(intl): parse Locale unicode extension keys#696
frostney merged 1 commit into
mainfrom
issue-601-intl-locale-unicode-extensions

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Jun 2, 2026

Summary

  • Parse Intl.Locale Unicode extension keywords for caseFirst (kf) and numeric (kn) alongside the existing Locale extension properties.
  • Move robust Unicode extension keyword lookup/mutation into Goccia.Intl.Helpers and have Collator share it instead of carrying a local copy.
  • Add focused Intl.Locale constructor coverage for extension-derived properties, option overrides, kn-true canonicalization, and baseName stripping.
  • Closes Intl: Locale unicode extension properties not parsed (-u- subtags) #601.

Testing

  • Verified no regressions and confirmed the new feature or bugfix in end-to-end JavaScript/TypeScript tests
    • ./build.pas testrunner
    • ./build/GocciaTestRunner tests/built-ins/Intl/Locale
    • ./build/GocciaTestRunner tests/built-ins/Intl/Collator
    • ./build/GocciaTestRunner tests/built-ins/Intl/NumberFormat tests/built-ins/Intl/RelativeTimeFormat
    • ./build/GocciaTestRunner tests/built-ins/Intl
    • ./build/GocciaTestRunner tests was also run; it failed only on existing FFI fixture loading (./fixtures/ffi/libfixture.dylib), unrelated to this Intl change.
  • Updated documentation
    • Not needed; this is an internal conformance bug fix covered by existing Intl docs.
  • 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

Additional regression check after review:

  • bun scripts/run_test262_suite.ts --suite-dir /tmp/goccia-test262.qpKiT7/repo --categories intl402 --filter 'intl402/Locale/constructor-non-iana-canon.js' --mode bytecode --jobs 1 --verbose passed against pinned test262 SHA d0c1b4555b03dd404873fd6422a4b5da00136500.

@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 5:45pm

Request Review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Jun 2, 2026

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 5d34c342-d987-43fc-8bbc-2a14a67914c8

📥 Commits

Reviewing files that changed from the base of the PR and between 4feb9be and 5123b0e.

📒 Files selected for processing (4)
  • source/units/Goccia.Intl.Helpers.pas
  • source/units/Goccia.Values.IntlCollator.pas
  • source/units/Goccia.Values.IntlLocale.pas
  • tests/built-ins/Intl/Locale/constructor.js
🚧 Files skipped from review as they are similar to previous changes (4)
  • tests/built-ins/Intl/Locale/constructor.js
  • source/units/Goccia.Intl.Helpers.pas
  • source/units/Goccia.Values.IntlLocale.pas
  • source/units/Goccia.Values.IntlCollator.pas

📝 Walkthrough

Walkthrough

This PR adds robust BCP-47 Unicode-extension range detection and two public helpers to add/remove -u- keywords; it updates Intl.Locale parsing/serialization and Intl.Collator to use those helpers and adds tests validating parsing, option precedence, canonicalization, and emission of empty keywords.

Changes

Unicode Locale Extension Support

Layer / File(s) Summary
Unicode Extension Helper Library
source/units/Goccia.Intl.Helpers.pas
Introduces range-finding routines for singleton extensions and public functions RemoveUnicodeLocaleExtensionKeyword and AddUnicodeLocaleExtensionKeyword. Reimplements LocaleWithoutUnicodeExtension and TryGetUnicodeLocaleExtensionKeyword to use range detection.
Locale Unicode Extension Parsing and Serialization
source/units/Goccia.Values.IntlLocale.pas
ParseTag extracts ca,co,hc,nu,fw,kf,kn using shared helpers and tracks presence flags. SetUnicodeExtensionKeyword gains AIncludeEmptyValue to allow emitting empty kf; kn emission now writes empty kn for true and kn-false only when numeric was explicitly present in the original tag or options.
Collator Option Handling with Unicode Extensions
source/units/Goccia.Values.IntlCollator.pas
Constructor now uses the shared Unicode-locale helpers for kn/kf/co parsing and mutation; removed local helper duplicates. Adds a post-option consistency pass removing conflicting -u- keywords and rebuilding FICULocale with normalized co when needed.
Unicode Extension Parsing Tests
tests/built-ins/Intl/Locale/constructor.js
New test cases verify Unicode keyword parsing into properties, constructor option precedence, numeric canonicalization, preservation of empty kf, and baseName stripping of extensions/private-use.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • frostney/GocciaScript#694: Related changes touching Collator numeric/caseFirst handling that complement this PR's parsing and keyword mutation infrastructure.

Suggested labels

bug, spec compliance, internal

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The PR title 'fix(intl): parse Locale unicode extension keys' clearly and specifically describes the main change: implementing parsing of Unicode extension keywords in Intl.Locale.
Description check ✅ Passed The PR description fully addresses the template structure with a clear summary of changes, comprehensive testing verification (with specific test command details), and explicitly notes documentation is not needed. The description is well-structured and complete.
Linked Issues check ✅ Passed The PR fully addresses issue #601 by parsing Unicode extension keywords (kf, kn, ca, co, hc, nu) into Locale properties, ensuring options override tag values, canonicalizing kn, and fixing baseName stripping.
Out of Scope Changes check ✅ Passed All changes are directly related to the PR objectives: moving Unicode extension logic to helpers, updating Collator to use shared helpers, updating Locale parsing, and adding focused tests. No unrelated changes detected.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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


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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

Suite Timing

Test Runner (interpreted: 9,880 passed; bytecode: 9,880 passed)
Metric Interpreted Bytecode
Total 9880 9880
Passed 9880 ✅ 9880 ✅
Workers 4 4
Test Duration 3.71s 3.60s
Lex (cumulative) 453.2ms 438.4ms
Parse (cumulative) 341.5ms 323.1ms
Compile (cumulative) 649.9ms
Execute (cumulative) 5.01s 4.33s
Engine Total (cumulative) 5.81s 5.74s
Lex (avg/worker) 113.3ms 109.6ms
Parse (avg/worker) 85.4ms 80.8ms
Compile (avg/worker) 162.5ms
Execute (avg/worker) 1.25s 1.08s
Engine Total (avg/worker) 1.45s 1.44s

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 287.54 MiB 279.95 MiB
GC Peak Live 287.55 MiB 279.96 MiB
GC Allocated During Run 292.09 MiB 284.49 MiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 1 1
GC Collected Objects 87 87
Heap Start Allocated 160.6 KiB 160.6 KiB
Heap End Allocated 1.54 MiB 1.54 MiB
Heap Delta Allocated 1.38 MiB 1.38 MiB
Heap Delta Free 890.4 KiB 890.4 KiB
Benchmarks (interpreted: 407; bytecode: 407)
Metric Interpreted Bytecode
Total 407 407
Workers 4 4
Duration 2.45min 2.37min

Memory

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

Metric Interpreted Bytecode
GC Live 3.97 MiB 3.97 MiB
GC Peak Live 123.57 MiB 90.99 MiB
GC Allocated During Run 16.33 GiB 10.76 GiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 2,810 2,657
GC Collected Objects 261,779,454 240,371,595
Heap Start Allocated 1.27 MiB 1.27 MiB
Heap End Allocated 1.27 MiB 1.27 MiB
Heap Delta Allocated 128 B 128 B

Measured on ubuntu-latest x64.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

Benchmark Results

407 benchmarks

Interpreted: 🟢 304 improved · 🔴 35 regressed · 68 unchanged · avg +7.6%
Bytecode: 🟢 329 improved · 🔴 31 regressed · 47 unchanged · avg +7.7%

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

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.

@frostney frostney marked this pull request as ready for review June 2, 2026 06:17
@coderabbitai coderabbitai Bot added bug Something isn't working spec compliance Mismatch against official JavaScript/TypeScript specification internal Refactoring, CI, tooling, cleanup labels Jun 2, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

test262 Conformance

Category Run Passed Δ Pass Failed Pass-rate Δ Rate
built-ins 23,449 16,077 +1 7,367 68.6% ±0pp
harness 116 72 ±0 44 62.1% ±0pp
intl402 3,324 1,000 +2 2,324 30.1% +0.1pp
language 23,635 14,631 ±0 9,004 61.9% ±0pp
staging 1,484 576 ±0 906 38.8% ±0pp
total 52,008 32,356 +3 19,645 62.2% ±0pp

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 (+3 / -0)

Newly passing (3):

  • built-ins/Number/prototype/toExponential/undefined-fractiondigits.js
  • intl402/Locale/constructor-options-casefirst-valid.js
  • intl402/Locale/constructor-options-numeric-valid.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.

@frostney frostney force-pushed the issue-601-intl-locale-unicode-extensions branch from 4feb9be to 5123b0e Compare June 2, 2026 17:45
@frostney frostney merged commit 68d2d20 into main Jun 2, 2026
14 checks passed
@frostney frostney deleted the issue-601-intl-locale-unicode-extensions branch June 2, 2026 19:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Intl: Locale unicode extension properties not parsed (-u- subtags)

1 participant