Skip to content

Fix ZonedDateTime DST-aware diff rounding#435

Merged
frostney merged 1 commit into
mainfrom
t3code/verify-implement-426
Apr 28, 2026
Merged

Fix ZonedDateTime DST-aware diff rounding#435
frostney merged 1 commit into
mainfrom
t3code/verify-implement-426

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Apr 28, 2026

Summary

  • Fix Temporal.ZonedDateTime.prototype.until/since rounding so date-based buckets use timezone-aware local boundary instants instead of fixed 24-hour days.
  • Add spring-forward and fall-back regressions for both until and since, covering day and hour rounding.
  • Update Temporal docs to mention DST-aware rounding across variable-length local days.

Fixes #426

@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 28, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
gocciascript-homepage Ignored Ignored Apr 28, 2026 10:52am

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 28, 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: 85c80a38-c792-4c31-9abc-167f0dcafc38

📥 Commits

Reviewing files that changed from the base of the PR and between 735c20e and 39f941f.

📒 Files selected for processing (4)
  • docs/built-ins-temporal.md
  • source/units/Goccia.Values.TemporalZonedDateTime.pas
  • tests/built-ins/Temporal/ZonedDateTime/prototype/since.js
  • tests/built-ins/Temporal/ZonedDateTime/prototype/until.js

📝 Walkthrough

Walkthrough

This PR implements DST-aware rounding for ZonedDateTime.prototype.until and since methods. The implementation refactors local component computation, introduces calendar-aware diff calculation and rounding functions, and replaces the previous generic rounding approach with zoned-specific logic. Documentation is updated to reflect DST awareness, and test coverage for DST transitions is added.

Changes

Cohort / File(s) Summary
Documentation
docs/built-ins-temporal.md
Clarifies that day-or-larger unit rounding is DST-aware and accounts for variable-length local days in ZonedDateTime.until/since.
Core Implementation
source/units/Goccia.Values.TemporalZonedDateTime.pas
Introduces ComputeLocalComponentsFromEpoch, ComputeZonedDateTimeDiffFields, and RoundZonedDateTimeDiffFields helpers to perform calendar-aware and DST-aware diff computation and rounding. Refactors ZonedDateTimeUntil and ZonedDateTimeSince to use the new functions instead of generic RoundDiffDuration, enabling correct rounding across DST transitions.
Test Coverage
tests/built-ins/Temporal/ZonedDateTime/prototype/since.js, tests/built-ins/Temporal/ZonedDateTime/prototype/until.js
Adds DST-aware rounding test cases covering spring-forward and fall-back transitions in America/New_York timezone, validating baseline day/hour/minute breakdowns and rounding with halfExpand mode.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

Suggested labels

bug, spec compliance, documentation

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Fix ZonedDateTime DST-aware diff rounding' clearly and concisely describes the primary change, which addresses DST-aware rounding for ZonedDateTime difference calculations.
Description check ✅ Passed The description includes a clear summary of changes, references the fixed issue (#426), and covers the three main aspects: DST-aware rounding fix, regression tests, and documentation updates.
Linked Issues check ✅ Passed All code changes directly address issue #426's requirements: DST-aware rounding via new calendar-aware diff engine, timezone-aware boundary instants for day buckets, and regression tests for spring-forward/fall-back transitions.
Out of Scope Changes check ✅ Passed All changes are directly scoped to fixing DST-aware rounding for ZonedDateTime.until/since: refactored diff computation, new rounding logic, documentation updates, and targeted test coverage for DST transitions.
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 bug Something isn't working documentation Improvements or additions to documentation spec compliance Mismatch against official JavaScript/TypeScript specification labels Apr 28, 2026
@github-actions
Copy link
Copy Markdown
Contributor

Benchmark Results

386 benchmarks

Interpreted: 🟢 33 improved · 🔴 66 regressed · 287 unchanged · avg -1.7%
Bytecode: 🟢 62 improved · 🔴 219 regressed · 105 unchanged · avg -1.4%

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

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 8056 8056
Tests Passed 8015 ✅ 8056 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 1.91s 1.80s
Tests Lex (cumulative) 200.1ms 125.6ms
Tests Parse (cumulative) 306.1ms 290.6ms
Tests Compile (cumulative) 190.3ms
Tests Execute (cumulative) 1.87s 1.50s
Tests Engine Total (cumulative) 2.38s 2.10s
Tests Lex (avg/worker) 50.0ms 31.4ms
Tests Parse (avg/worker) 76.5ms 72.6ms
Tests Compile (avg/worker) 47.6ms
Tests Execute (avg/worker) 467.3ms 374.5ms
Tests Engine Total (avg/worker) 593.9ms 526.1ms
Benchmarks Total 386 386
Benchmarks Workers 4 4
Benchmarks Duration 2.94min 2.94min

Measured on ubuntu-latest x64.

@frostney frostney merged commit 79ceb33 into main Apr 28, 2026
12 checks passed
@frostney frostney deleted the t3code/verify-implement-426 branch April 28, 2026 11:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working documentation Improvements or additions to documentation spec compliance Mismatch against official JavaScript/TypeScript specification

Projects

None yet

Development

Successfully merging this pull request may close these issues.

DST-aware rounding in RoundDiffDuration for ZonedDateTime.prototype.until/since

1 participant