Skip to content

Add default builtin shims for legacy globals#330

Merged
frostney merged 1 commit into
mainfrom
t3code/atob-btoa-shim-default
Apr 17, 2026
Merged

Add default builtin shims for legacy globals#330
frostney merged 1 commit into
mainfrom
t3code/atob-btoa-shim-default

Conversation

@frostney
Copy link
Copy Markdown
Owner

Summary

  • Introduces a shim infrastructure (Goccia.Shims) that provides backwards-compatible legacy globals on top of modern native APIs
  • Each shim is a valid export const module evaluated during engine bootstrap; exported values are bound into the global scope via DefineLexicalBinding
  • Shim names are registered in Goccia.shims for introspection
  • Removes the native Pascal atob/btoa implementation (~200 LOC) in favor of GocciaScript shims backed by Uint8Array.fromBase64/toBase64
  • Adds parseInt/parseFloat shims delegating to Number.parseInt/Number.parseFloat
  • Adds a Date shim class backed by Temporal.Instant, Temporal.ZonedDateTime, and Temporal.PlainDateTime

Shim registry

Shim Delegates to Source
btoa Uint8Array.prototype.toBase64 WHATWG §8.3
atob Uint8Array.fromBase64 WHATWG §8.3
parseInt Number.parseInt ES2027 §19.2.5
parseFloat Number.parseFloat ES2027 §19.2.4
Date Temporal.* Legacy Date API

Adding a new shim is one record entry in DEFAULT_SHIMS.

Test plan

  • All existing atob/btoa tests pass (28 assertions)
  • parseInt/parseFloat identity tests pass
  • Date constructor and method tests pass (40 assertions)
  • Goccia.shims introspection test updated
  • Full suite passes in both interpreter and bytecode modes (no regressions)
  • Formatting clean

🤖 Generated with Claude Code

- Move atob, btoa, parseInt, parseFloat, and Date into shims
- Register shim names in Goccia.shims and add coverage tests
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 17, 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: eeb95f55-97c1-4f2d-9088-219e92db2011

📥 Commits

Reviewing files that changed from the base of the PR and between a5d7b20 and 4e4fdd2.

📒 Files selected for processing (10)
  • tests/built-ins/Date/constructor.js
  • tests/built-ins/Date/methods.js
  • tests/built-ins/Goccia/shims.js
  • tests/built-ins/parseFloat.js
  • tests/built-ins/parseInt.js
  • units/Goccia.Builtins.Globals.pas
  • units/Goccia.Engine.Backend.pas
  • units/Goccia.Engine.pas
  • units/Goccia.Error.Messages.pas
  • units/Goccia.Shims.pas
💤 Files with no reviewable changes (2)
  • units/Goccia.Error.Messages.pas
  • units/Goccia.Builtins.Globals.pas

📝 Walkthrough

Walkthrough

This PR migrates native btoa and atob implementations to shimmed versions by introducing a new Goccia.Shims unit. The Engine and Backend are updated to register shim names and execute loaded shimmed implementations (btoa, atob, parseInt, parseFloat, Date) during initialization. Related test coverage and error messages are updated accordingly.

Changes

Cohort / File(s) Summary
Shim Infrastructure
units/Goccia.Shims.pas
New unit that defines shim metadata API (TGocciaShimDefinition, DefaultShimCount, DefaultShim, RegisterDefaultShimNames) and implements five shimmed globals (btoa, atob, parseInt, parseFloat, Date) as parsed/evaluated GocciaScript module sources.
Engine Integration
units/Goccia.Engine.pas, units/Goccia.Engine.Backend.pas
Added ExecuteShims procedures and updated initialization flow: RegisterDefaultShimNames is called before builtin registration, and ExecuteShims is called after to load each shim's source via parsing/evaluation into the global scope.
Native Implementation Cleanup
units/Goccia.Builtins.Globals.pas, units/Goccia.Error.Messages.pas
Removed native BtoaCallback and AtobCallback method implementations, their global bindings, and related error message constants.
Test Coverage
tests/built-ins/Date/constructor.js, tests/built-ins/Date/methods.js, tests/built-ins/parseInt.js, tests/built-ins/parseFloat.js, tests/built-ins/Goccia/shims.js
Added comprehensive Date constructor/method tests, parseInt/parseFloat tests, and updated shims registry test to verify five registered shim names (atob, btoa, parseInt, parseFloat, Date).

Sequence Diagram(s)

sequenceDiagram
    participant Engine
    participant Backend
    participant Shims
    participant Interpreter
    participant Parser
    participant Scope as Global Scope

    Engine->>Backend: RegisterBuiltIns()
    Backend->>Shims: RegisterDefaultShimNames(FShims)
    Note over Shims: Populates string list with<br/>shim names
    
    Backend->>Interpreter: Create interpreter instance
    Backend->>Shims: ExecuteShims()
    
    loop For each default shim (0..DefaultShimCount-1)
        Shims->>Shims: DefaultShim(Index)
        Shims->>Parser: Lex & parse Shim.Source
        Parser->>Shims: Return parsed program
        Shims->>Scope: Create child module scope<br/>(skModule)
        Shims->>Interpreter: Evaluate program in<br/>module scope
        Interpreter->>Scope: Execute statements
        Scope->>Shims: Return exported value<br/>(Shim.Name)
        Shims->>Scope: Define lexical binding<br/>(Shim.Name = value)
    end
    
    Note over Engine,Scope: Shims now available as<br/>global constants
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested labels

new feature, internal

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main change: introducing a shim infrastructure for legacy globals like atob, btoa, parseInt, parseFloat, and Date.
Description check ✅ Passed The description is comprehensive and well-structured, covering the summary, implementation details, shim registry, and test plan with all checklist items completed.
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 new feature New feature or request internal Refactoring, CI, tooling, cleanup labels Apr 17, 2026
@github-actions
Copy link
Copy Markdown
Contributor

Benchmark Results

364 benchmarks

Interpreted: 🟢 89 improved · 🔴 74 regressed · 201 unchanged · avg -2.8%
Bytecode: 🟢 25 improved · 🔴 252 regressed · 87 unchanged · avg -7.8%

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

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

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 5467 5467
Tests Passed 5426 ✅ 5467 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 1.20s 1.20s
Tests Lex (cumulative) 196.3ms 119.5ms
Tests Parse (cumulative) 269.6ms 252.2ms
Tests Compile (cumulative) 151.9ms
Tests Execute (cumulative) 1.01s 972.6ms
Tests Engine Total (cumulative) 1.48s 1.50s
Tests Lex (avg/worker) 49.1ms 29.9ms
Tests Parse (avg/worker) 67.4ms 63.0ms
Tests Compile (avg/worker) 38.0ms
Tests Execute (avg/worker) 253.1ms 243.1ms
Tests Engine Total (avg/worker) 369.5ms 374.0ms
Benchmarks Total 364 364
Benchmarks Workers 4 4
Benchmarks Duration 2.95min 2.80min

Measured on ubuntu-latest x64.

@frostney frostney merged commit 14eafde into main Apr 17, 2026
17 checks passed
@frostney frostney deleted the t3code/atob-btoa-shim-default branch April 17, 2026 21:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

internal Refactoring, CI, tooling, cleanup new feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant