Skip to content

Add JSONC support for structured module globals#304

Merged
frostney merged 2 commits into
mainfrom
t3code/jsonc-as-json5
Apr 14, 2026
Merged

Add JSONC support for structured module globals#304
frostney merged 2 commits into
mainfrom
t3code/jsonc-as-json5

Conversation

@frostney
Copy link
Copy Markdown
Owner

Summary

  • Treat .jsonc files as structured module globals alongside .json5.
  • Update extension detection so JSONC is recognized as a JSON5-style structured globals format.
  • Add coverage for importing JSONC module globals and validating exported scalar, array, and nested object values.

Testing

  • Added unit coverage in Goccia.ScriptLoader.Globals.Test.pas for config.jsonc detection.
  • Added module import test in tests/language/modules/jsonc-import.js using tests/language/modules/helpers/config.jsonc.
  • Not run

- recognize `.jsonc` alongside JSON5 in module import handling
- add coverage for JSONC structured globals detection and import
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 14, 2026

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: 96191b2f-37db-4f1f-b920-d98688b4288a

📥 Commits

Reviewing files that changed from the base of the PR and between df6be10 and d3d63d8.

📒 Files selected for processing (1)
  • tests/language/modules/jsonc-import.js
🚧 Files skipped from review as they are similar to previous changes (1)
  • tests/language/modules/jsonc-import.js

📝 Walkthrough

Walkthrough

Adds .jsonc support: a JSONC test fixture and Jest tests, a new EXT_JSONC constant and module-import recognition for .jsonc, and test assertions verifying .jsonc is treated as structured/JSON5-compatible globals.

Changes

Cohort / File(s) Summary
Test Configuration & Verification
tests/language/modules/helpers/config.jsonc, tests/language/modules/jsonc-import.js
Add a JSONC test fixture and a Jest suite that imports/parses config.jsonc, asserts scalar/array/object exports, and checks JSON5 parsing error handling.
File Extension Support
units/Goccia.FileExtensions.pas
Introduce EXT_JSONC, expand ModuleImportExtensions to include .jsonc, and update IsJSON5Extension to treat .jsonc as JSON5-compatible.
Structured Globals Test
units/Goccia.ScriptLoader.Globals.Test.pas
Add assertions that config.jsonc is recognized as a structured globals file and as JSON5-compatible.

Sequence Diagram(s)

mermaid
sequenceDiagram
participant Test as Test (Jest)
participant Loader as ScriptLoader
participant Ext as FileExtensions
participant Parser as JSON5 Parser
Test->>Loader: import './helpers/config.jsonc'
Loader->>Ext: check extension('config.jsonc')
Ext-->>Loader: is JSON5-compatible (true)
Loader->>Parser: parse file contents as JSON5/JSONC
Parser-->>Loader: parsed module exports
Loader-->>Test: provide named exports

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Add JSONC support for structured module globals' clearly and concisely summarizes the main change: introducing JSONC file format support for structured module globals.
Description check ✅ Passed The description covers the main changes, testing approach, and includes a summary section and testing checklist items addressing both new features and documentation requirements.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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


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

@coderabbitai coderabbitai Bot added the new feature New feature or request label Apr 14, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
tests/language/modules/jsonc-import.js (1)

10-24: Consider adding one negative-path JSONC import test.

Current coverage is happy-path only; adding a malformed JSONC import assertion would better guard parser error handling regressions.

As per coding guidelines: JavaScript tests should cover happy paths, edge cases, and error cases.

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

In `@tests/language/modules/jsonc-import.js` around lines 10 - 24, Add a
negative-path test to the existing "JSONC import" suite that asserts a malformed
JSONC file import/parsing throws; create a new test (e.g., test("fails on
malformed JSONC", ...)) that attempts to import or parse a deliberately-bad
JSONC fixture (or use dynamic import/require inside a function) and expect it to
throw (using expect(() => importOrParseBadJsonc()).toThrow() or await
expect(importBadJsonc()).rejects.toThrow()); reference the suite name "JSONC
import" and the new test name so it's added alongside the existing tests for
top-level scalars and arrays/nested objects.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@tests/language/modules/jsonc-import.js`:
- Around line 10-24: Add a negative-path test to the existing "JSONC import"
suite that asserts a malformed JSONC file import/parsing throws; create a new
test (e.g., test("fails on malformed JSONC", ...)) that attempts to import or
parse a deliberately-bad JSONC fixture (or use dynamic import/require inside a
function) and expect it to throw (using expect(() =>
importOrParseBadJsonc()).toThrow() or await
expect(importBadJsonc()).rejects.toThrow()); reference the suite name "JSONC
import" and the new test name so it's added alongside the existing tests for
top-level scalars and arrays/nested objects.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 620fb803-7ab7-413a-8678-f5902c350325

📥 Commits

Reviewing files that changed from the base of the PR and between 5ddc214 and df6be10.

📒 Files selected for processing (4)
  • tests/language/modules/helpers/config.jsonc
  • tests/language/modules/jsonc-import.js
  • units/Goccia.FileExtensions.pas
  • units/Goccia.ScriptLoader.Globals.Test.pas

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 14, 2026

Benchmark Results

364 benchmarks

Interpreted: 🟢 191 improved · 🔴 44 regressed · 129 unchanged · avg +2.2%
Bytecode: 🟢 349 improved · 🔴 4 regressed · 11 unchanged · avg +28.2%

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

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 Apr 14, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 5358 5358
Tests Passed 5317 ✅ 5358 ✅
Tests Skipped 41 0
Tests Test Duration 368.9ms 363.5ms
Tests Lex 105.4ms 69.7ms
Tests Parse 138.1ms 136.2ms
Tests Compile 82.5ms
Tests Execute 387.5ms 399.3ms
Tests Engine Total 631.0ms 687.7ms
Benchmarks Total 364 364
Benchmarks Duration 9.98min 8.95min

Measured on ubuntu-latest x64.

- Verify malformed JSONC throws SyntaxError
- Extend JSONC import test coverage
@frostney frostney merged commit fe8c8fa into main Apr 14, 2026
10 checks passed
@frostney frostney deleted the t3code/jsonc-as-json5 branch April 14, 2026 17:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

new feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant