Skip to content

Add Goccia.build platform metadata#276

Merged
frostney merged 2 commits intomainfrom
t3code/goccia-build-os-arch
Apr 11, 2026
Merged

Add Goccia.build platform metadata#276
frostney merged 2 commits intomainfrom
t3code/goccia-build-os-arch

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Apr 11, 2026

Summary

  • Add a new Goccia.build object with compile-time os and arch metadata.
  • Wire the build metadata into the engine/runtime bootstrap so it is always available on the Goccia global.
  • Document the new API in docs/built-ins.md and add end-to-end coverage in tests/built-ins/Goccia/build.js.

Testing

  • Added a dedicated JS test file covering Goccia.build shape, value stability, enumerability, and read-only behavior.
  • Documentation updated to describe the new Goccia.build contract and supported platform values.

- expose compile-time `os` and `arch` on `Goccia.build`
- add JS coverage and update built-ins docs
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 11, 2026

📝 Walkthrough

Walkthrough

Added new Goccia.build property to the engine-provided global Goccia object, exposing compile-time platform metadata (os and arch). Includes platform detection unit, bootstrap registration logic, documentation updates, and comprehensive test coverage.

Changes

Cohort / File(s) Summary
Documentation
AGENTS.md, docs/built-ins.md
Updated documentation to describe new Goccia.build property with os and arch fields reflecting compile-time platform information.
Platform Detection
units/Goccia.Platform.pas
New Pascal unit implementing GetBuildOS and GetBuildArch functions using conditional compilation to detect platform and architecture at compile time, defaulting to 'unknown' if unrecognized.
Engine & Bootstrap Implementation
units/Goccia.Engine.pas, units/Goccia.Runtime.Bootstrap.pas
Added registration logic to create BuildObj with enumerable os and arch properties and assign to global Goccia.build during runtime bootstrap initialization.
Test Suite
tests/built-ins/Goccia/build.js
New test file validating Goccia.build existence, type correctness, property enumerability, read-only behavior, and stability of os and arch values.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Suggested labels

new feature

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: adding a new Goccia.build platform metadata feature to the codebase.
Description check ✅ Passed The description covers the key aspects of the change (Summary and Testing sections), but the Testing section does not include the checkbox structure required by the template.
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.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 11, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 4708 4708
Tests Passed 4667 ✅ 4708 ✅
Tests Skipped 41 0
Tests Test Duration 340.7ms 326.6ms
Tests Lex 93.0ms 62.5ms
Tests Parse 122.1ms 121.0ms
Tests Compile 72.3ms
Tests Execute 356.6ms 356.9ms
Tests Engine Total 571.7ms 612.7ms
Benchmarks Total 364 364
Benchmarks Duration 10.11min 8.31min

Measured on ubuntu-latest x64.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 11, 2026

Benchmark Results

364 benchmarks

Interpreted: 🟢 277 improved · 🔴 40 regressed · 47 unchanged · avg +5.0%
Bytecode: 🟢 112 improved · 🔴 87 regressed · 165 unchanged · avg +0.6%

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

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.

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

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (2)
units/Goccia.Runtime.Bootstrap.pas (1)

546-549: Use PropertyNames constants for bootstrap build keys too.

Line 546, Line 548, and Line 557 add new runtime property names as string literals. Please route them through Goccia.Constants.PropertyNames for consistency with the project’s runtime-constant policy.

As per coding guidelines, use runtime constant units instead of hardcoded string literals for runtime property names (Goccia.Constants.PropertyNames).

Also applies to: 557-557

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

In `@units/Goccia.Runtime.Bootstrap.pas` around lines 546 - 549, The code is
adding runtime properties using string literals for keys; replace those literals
with the centralized constants from Goccia.Constants.PropertyNames. Update the
BuildObj.DefineProperty calls that currently pass 'os', 'arch' (and the one at
line ~557) to use the appropriate PropertyNames constant identifiers instead
(e.g. PropertyNames.Os, PropertyNames.Arch, etc.), keeping the existing
TGocciaPropertyDescriptorData.Create and TGocciaStringLiteralValue.Create calls
and their values (GetBuildOS, GetBuildArch) unchanged so only the property name
argument is switched to the constant.
units/Goccia.Engine.pas (1)

734-738: Use property-name constants for Goccia.build keys.

Line 735, Line 737, and Line 746 introduce new hardcoded runtime property names ('os', 'arch', 'build'). Please wire these through Goccia.Constants.PropertyNames to keep the metadata surface centralized and avoid drift across bootstrap paths.

♻️ Suggested change
-  BuildObj.DefineProperty('os', TGocciaPropertyDescriptorData.Create(
+  BuildObj.DefineProperty(PROP_OS, TGocciaPropertyDescriptorData.Create(
     TGocciaStringLiteralValue.Create(GetBuildOS), [pfEnumerable]));
-  BuildObj.DefineProperty('arch', TGocciaPropertyDescriptorData.Create(
+  BuildObj.DefineProperty(PROP_ARCH, TGocciaPropertyDescriptorData.Create(
     TGocciaStringLiteralValue.Create(GetBuildArch), [pfEnumerable]));
@@
-  GocciaObj.AssignProperty('build', BuildObj);
+  GocciaObj.AssignProperty(PROP_BUILD, BuildObj);

As per coding guidelines, use runtime constant units instead of hardcoded string literals for runtime property names (Goccia.Constants.PropertyNames).

Also applies to: 746-746

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

In `@units/Goccia.Engine.pas` around lines 734 - 738, Replace hardcoded property
name literals used when defining the Goccia.build object with the canonical
constants from Goccia.Constants.PropertyNames: locate where BuildObj is
populated (TGocciaObjectValue.Create and the DefineProperty calls in
units/Goccia.Engine.pas), and swap the string keys 'os', 'arch' and the 'build'
property usage to use the corresponding constants (e.g., PropertyNames.Os,
PropertyNames.Arch, PropertyNames.Build) so all runtime property names are
centralized and consistent.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@tests/built-ins/Goccia/build.js`:
- Around line 6-7: The test currently gates the entire Goccia.build suite behind
a runtime check (const hasGoccia = typeof Goccia !== "undefined") which can mask
regressions; remove the conditional skip and make the suite unconditional,
replacing any top-level existence check with an explicit assertion inside the
suite (assert typeof Goccia !== "undefined" or equivalent) and keep testing
Goccia.build directly; update references to hasGoccia and any conditional
branches so the tests always run and fail fast if the Goccia global is missing.

---

Nitpick comments:
In `@units/Goccia.Engine.pas`:
- Around line 734-738: Replace hardcoded property name literals used when
defining the Goccia.build object with the canonical constants from
Goccia.Constants.PropertyNames: locate where BuildObj is populated
(TGocciaObjectValue.Create and the DefineProperty calls in
units/Goccia.Engine.pas), and swap the string keys 'os', 'arch' and the 'build'
property usage to use the corresponding constants (e.g., PropertyNames.Os,
PropertyNames.Arch, PropertyNames.Build) so all runtime property names are
centralized and consistent.

In `@units/Goccia.Runtime.Bootstrap.pas`:
- Around line 546-549: The code is adding runtime properties using string
literals for keys; replace those literals with the centralized constants from
Goccia.Constants.PropertyNames. Update the BuildObj.DefineProperty calls that
currently pass 'os', 'arch' (and the one at line ~557) to use the appropriate
PropertyNames constant identifiers instead (e.g. PropertyNames.Os,
PropertyNames.Arch, etc.), keeping the existing
TGocciaPropertyDescriptorData.Create and TGocciaStringLiteralValue.Create calls
and their values (GetBuildOS, GetBuildArch) unchanged so only the property name
argument is switched to the constant.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 4d415694-f75c-4224-b85d-c63a49c306d9

📥 Commits

Reviewing files that changed from the base of the PR and between 65514aa and a91846b.

📒 Files selected for processing (6)
  • AGENTS.md
  • docs/built-ins.md
  • tests/built-ins/Goccia/build.js
  • units/Goccia.Engine.pas
  • units/Goccia.Platform.pas
  • units/Goccia.Runtime.Bootstrap.pas

Comment thread tests/built-ins/Goccia/build.js
@frostney frostney merged commit 84b743c into main Apr 11, 2026
9 checks passed
@frostney frostney deleted the t3code/goccia-build-os-arch branch April 11, 2026 18:33
frostney added a commit that referenced this pull request Apr 11, 2026
Incorporates 5 commits from main:
- TextEncoder and TextDecoder built-ins (#272)
- Make import.meta tests account for Windows drive letters (#274)
- Fixes tagged template object identity (#275)
- Add Goccia.build platform metadata (#276)
- Add ToObject coercion for primitives across all Object.* static methods (#271)

Conflict resolution in 3 files (all "both sides added" — keep both):

Goccia.Engine.pas / Goccia.Runtime.Bootstrap.pas:
  - Added ggTextEncoder and ggTextDecoder to TGocciaGlobalBuiltin enum
  - Added both to DefaultGlobals alongside ggURL
  - Added FBuiltinTextEncoder/FBuiltinTextDecoder fields, Free calls,
    registration blocks, Expose* helpers, and constructor TypeDef blocks
    alongside the existing URL equivalents

Goccia.Values.ClassValue.pas:
  - Added TGocciaTextEncoderClassValue and TGocciaTextDecoderClassValue
    declarations, impl uses, and CreateNativeInstance implementations
    alongside the existing URL equivalents

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

new feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant