Skip to content

Simplify hasOwnProperty shim binding#347

Merged
frostney merged 2 commits into
mainfrom
t3code/hasownproperty-shim-1
Apr 18, 2026
Merged

Simplify hasOwnProperty shim binding#347
frostney merged 2 commits into
mainfrom
t3code/hasownproperty-shim-1

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Apr 18, 2026

Summary

  • Simplified the hasOwnProperty shim by replacing the temporary class with an inline object literal binding.
  • Kept the exported shim behavior unchanged while reducing indirection in Goccia.Shims.pas.

- Replace helper class with inline object method binding
- Preserve the non-enumerable prototype shim behavior
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 18, 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: d405f032-24d0-4f02-9400-052715e53b22

📥 Commits

Reviewing files that changed from the base of the PR and between 9e38d15 and 166e895.

📒 Files selected for processing (1)
  • source/units/Goccia.Shims.pas
🚧 Files skipped from review as they are similar to previous changes (1)
  • source/units/Goccia.Shims.pas

📝 Walkthrough

Walkthrough

The hasOwnProperty shim in source/units/Goccia.Shims.pas was changed to directly define a value(prop) { return Object.hasOwn(this, prop); } function on the prototype and return the defined proto.hasOwnProperty reference instead of creating an internal helper class and extracting its method.

Changes

Cohort / File(s) Summary
hasOwnProperty shim
source/units/Goccia.Shims.pas
Replaced internal helper-class-based creation of the hasOwnProperty function with an inline value(prop) { return Object.hasOwn(this, prop); } property descriptor on the prototype and return of proto.hasOwnProperty; no public/exported declarations changed.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description provides a summary of the changes but is missing key sections required by the template: Testing checklist items are absent and no related issues are linked. Add the Testing section with checkboxes for verification steps and link related issues using 'Closes #...' if applicable to meet the full template requirements.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Simplify hasOwnProperty shim binding' accurately reflects the main change: replacing a temporary helper class with an inline object literal binding in the hasOwnProperty shim.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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


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

@coderabbitai coderabbitai Bot added the internal Refactoring, CI, tooling, cleanup label Apr 18, 2026
- Define the shim method directly on the prototype
- Return the installed prototype method instead of a detached function
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 18, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 5789 5789
Tests Passed 5748 ✅ 5789 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 1.30s 1.30s
Tests Lex (cumulative) 187.0ms 121.2ms
Tests Parse (cumulative) 252.9ms 255.7ms
Tests Compile (cumulative) 165.1ms
Tests Execute (cumulative) 1.45s 1.23s
Tests Engine Total (cumulative) 1.89s 1.77s
Tests Lex (avg/worker) 46.8ms 30.3ms
Tests Parse (avg/worker) 63.2ms 63.9ms
Tests Compile (avg/worker) 41.3ms
Tests Execute (avg/worker) 363.7ms 308.2ms
Tests Engine Total (avg/worker) 473.6ms 443.7ms
Benchmarks Total 386 386
Benchmarks Workers 4 4
Benchmarks Duration 2.98min 2.89min

Measured on ubuntu-latest x64.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 18, 2026

Benchmark Results

386 benchmarks

Interpreted: 🟢 172 improved · 🔴 44 regressed · 170 unchanged · avg +3.9%
Bytecode: 🟢 1 improved · 🔴 379 regressed · 6 unchanged · avg -20.9%

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

Measured on ubuntu-latest x64. Benchmark ranges compare cached main-branch min/max ops/sec with the PR run; overlapping ranges are treated as unchanged noise. Percentage deltas are secondary context.

@frostney frostney merged commit e89d8b2 into main Apr 18, 2026
10 checks passed
@frostney frostney deleted the t3code/hasownproperty-shim-1 branch April 18, 2026 22:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

internal Refactoring, CI, tooling, cleanup

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant