Skip to content

Use shared Temporal property names in PlainDate parsing#315

Merged
frostney merged 2 commits into
mainfrom
t3code/fix-309
Apr 16, 2026
Merged

Use shared Temporal property names in PlainDate parsing#315
frostney merged 2 commits into
mainfrom
t3code/fix-309

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Apr 16, 2026

Summary

  • Replaced hard-coded year, month, and day property lookups with shared property name constants.
  • Updated the missing-property type error to format the field names from the same constants, keeping the message aligned with the lookup keys.
  • Added the shared property names unit to the implementation uses list.

Fixes #309

- Replace string literals with PROP_YEAR, PROP_MONTH, and PROP_DAY
- Format missing-property errors with the shared property names
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 16, 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: 7ba6d274-3062-4f0e-bdb2-c09728d5b482

📥 Commits

Reviewing files that changed from the base of the PR and between c4eb19e and aac4470.

📒 Files selected for processing (1)
  • units/Goccia.Values.TemporalPlainDate.pas
✅ Files skipped from review due to trivial changes (1)
  • units/Goccia.Values.TemporalPlainDate.pas

📝 Walkthrough

Walkthrough

Replaced hardcoded temporal property name literals with centralized constants and consolidated repeated type-error messages into a single formatted message in the CoercePlainDate implementation.

Changes

Cohort / File(s) Summary
TemporalPlainDate update
units/Goccia.Values.TemporalPlainDate.pas
Added Goccia.Constants.PropertyNames to implementation uses. Replaced GetProperty('year'/'month'/'day') with GetProperty(PROP_YEAR/PROP_MONTH/PROP_DAY). Consolidated three duplicated ThrowTypeError messages into one RequiredFieldsMsg using Format with the same constants.

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~3 minutes

Possibly related issues

  • Issue 309: Centralize Temporal property names in CoercePlainDate (TemporalPlainDate.pas)
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the main change: replacing hard-coded property strings with shared constants for Temporal property names in PlainDate parsing.
Description check ✅ Passed The PR description adequately covers the main change and links to the related issue (#309), though it omits the Testing section from the template.
Linked Issues check ✅ Passed All objectives from issue #309 are met: PropertyNames unit added to uses, property string literals replaced with constants, and error message formatted using the same constants.
Out of Scope Changes check ✅ Passed All changes are directly related to the stated objective of centralizing Temporal property names in CoercePlainDate; no unrelated modifications detected.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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


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

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
units/Goccia.Values.TemporalPlainDate.pas (1)

131-137: Optional: compute the required-fields error message once.

The same Format(...) call is repeated three times; extracting it improves readability and avoids duplication.

♻️ Proposed refactor
 function CoercePlainDate(const AValue: TGocciaValue; const AMethod: string): TGocciaTemporalPlainDateValue;
 var
   DateRec: TTemporalDateRecord;
   TimeRec: TTemporalTimeRecord;
   Obj: TGocciaObjectValue;
   V, VMonth, VDay: TGocciaValue;
+  RequiredPropsError: string;
 begin
@@
   else if AValue is TGocciaObjectValue then
   begin
     Obj := TGocciaObjectValue(AValue);
+    RequiredPropsError := Format('%s requires %s, %s, %s properties', [AMethod, PROP_YEAR, PROP_MONTH, PROP_DAY]);
     V := Obj.GetProperty(PROP_YEAR);
     if (V = nil) or (V is TGocciaUndefinedLiteralValue) then
-      ThrowTypeError(Format('%s requires %s, %s, %s properties', [AMethod, PROP_YEAR, PROP_MONTH, PROP_DAY]), SSuggestTemporalFromArg);
+      ThrowTypeError(RequiredPropsError, SSuggestTemporalFromArg);
     VMonth := Obj.GetProperty(PROP_MONTH);
     if (VMonth = nil) or (VMonth is TGocciaUndefinedLiteralValue) then
-      ThrowTypeError(Format('%s requires %s, %s, %s properties', [AMethod, PROP_YEAR, PROP_MONTH, PROP_DAY]), SSuggestTemporalFromArg);
+      ThrowTypeError(RequiredPropsError, SSuggestTemporalFromArg);
     VDay := Obj.GetProperty(PROP_DAY);
     if (VDay = nil) or (VDay is TGocciaUndefinedLiteralValue) then
-      ThrowTypeError(Format('%s requires %s, %s, %s properties', [AMethod, PROP_YEAR, PROP_MONTH, PROP_DAY]), SSuggestTemporalFromArg);
+      ThrowTypeError(RequiredPropsError, SSuggestTemporalFromArg);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@units/Goccia.Values.TemporalPlainDate.pas` around lines 131 - 137, The
repeated Format(...) string for the required-fields error should be computed
once into a local variable (e.g., RequiredFieldsMsg) before the property checks
and then reused in the three ThrowTypeError calls; update the code around
ThrowTypeError/Format that references AMethod, PROP_YEAR, PROP_MONTH, PROP_DAY
so each check (VYear, VMonth, VDay) calls ThrowTypeError(RequiredFieldsMsg,
SSuggestTemporalFromArg) instead of repeating the Format expression.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@units/Goccia.Values.TemporalPlainDate.pas`:
- Around line 131-137: The repeated Format(...) string for the required-fields
error should be computed once into a local variable (e.g., RequiredFieldsMsg)
before the property checks and then reused in the three ThrowTypeError calls;
update the code around ThrowTypeError/Format that references AMethod, PROP_YEAR,
PROP_MONTH, PROP_DAY so each check (VYear, VMonth, VDay) calls
ThrowTypeError(RequiredFieldsMsg, SSuggestTemporalFromArg) instead of repeating
the Format expression.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: d3da270d-9608-4c1f-824e-f15d6b937838

📥 Commits

Reviewing files that changed from the base of the PR and between 5daf610 and c4eb19e.

📒 Files selected for processing (1)
  • units/Goccia.Values.TemporalPlainDate.pas

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 16, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 5358 5358
Tests Passed 5317 ✅ 5358 ✅
Tests Skipped 41 0
Tests Test Duration 988.0ms 877.4ms
Tests Lex 248.7ms 151.2ms
Tests Parse 277.1ms 244.5ms
Tests Compile 159.2ms
Tests Execute 1.02s 950.8ms
Tests Engine Total 1.55s 1.51s
Benchmarks Total 364 364
Benchmarks Duration 8.26min 7.85min

Measured on ubuntu-latest x64.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 16, 2026

Benchmark Results

364 benchmarks

Interpreted: 🟢 16 improved · 🔴 304 regressed · 44 unchanged · avg -6.9%
Bytecode: 🟢 47 improved · 🔴 85 regressed · 232 unchanged · avg -0.6%

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

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.

- Build the Temporal.PlainDate object-property error once
- Reuse it for missing year, month, and day checks
@frostney frostney merged commit 00c1c24 into main Apr 16, 2026
10 checks passed
@frostney frostney deleted the t3code/fix-309 branch April 16, 2026 18:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Centralize Temporal property names in CoercePlainDate (TemporalPlainDate.pas)

1 participant