Skip to content

fix(engine): materialize heavyweight globals lazily#790

Draft
frostney wants to merge 1 commit into
mainfrom
issue-788-lazy-builtins
Draft

fix(engine): materialize heavyweight globals lazily#790
frostney wants to merge 1 commit into
mainfrom
issue-788-lazy-builtins

Conversation

@frostney

Copy link
Copy Markdown
Owner

Summary

  • Add lazy global object descriptors for heavyweight globals: Temporal, Intl, Atomics, Proxy, Reflect, DisposableStack, and AsyncDisposableStack.
  • Keep the global names present in declaration/enumeration order while materializing backing objects only on direct or reflective touch.
  • Stop the Date shim from capturing Intl constructors during engine boot, and remove the i386-win32 large-address-aware test runner workaround.

Closes #788

Testing

  • Verified no regressions and confirmed the new feature or bugfix in end-to-end JavaScript/TypeScript tests
  • Updated documentation
  • Optional: Verified no regressions and confirmed the new feature or bugfix in native Pascal tests (if AST, scope, evaluator, or value types changed)
  • Optional: Verified no benchmark regressions or confirmed benchmark coverage for the change

Verification run:

  • ./build.pas --clean testrunner
  • ./build/GocciaTestRunner tests/built-ins/global-properties/lazy-builtins.js
  • ./build/GocciaTestRunner tests/built-ins/global-properties/lazy-builtins.js --mode=bytecode
  • ./build/GocciaTestRunner tests/built-ins/global-properties/global-this.js tests/built-ins/Number/prototype/toLocaleString.js tests/language/declarations/let/global-shadow-configurable-builtin.js tests/language/var/shadow-builtin-globals.js
  • ./build/GocciaTestRunner tests/built-ins/global-properties/global-this.js tests/built-ins/Number/prototype/toLocaleString.js tests/language/declarations/let/global-shadow-configurable-builtin.js tests/language/var/shadow-builtin-globals.js --mode=bytecode
  • ./build/GocciaTestRunner tests
  • ./build/GocciaTestRunner tests --mode=bytecode
  • ./format.pas --check
  • ./build.pas benchmarkrunner
  • ./build/GocciaBenchmarkRunner benchmarks/temporal.js benchmarks/intl.js benchmarks/atomics.js --no-progress --format compact-json --output=/tmp/goccia-788-bench-interpreted.json
  • ./build/GocciaBenchmarkRunner benchmarks/temporal.js benchmarks/intl.js benchmarks/atomics.js --mode=bytecode --no-progress --format compact-json --output=/tmp/goccia-788-bench-bytecode.json
  • Final rebuild after formatting: ./build.pas testrunner
  • Final focused rerun: ./build/GocciaTestRunner tests/built-ins/global-properties/lazy-builtins.js
  • Final focused bytecode rerun: ./build/GocciaTestRunner tests/built-ins/global-properties/lazy-builtins.js --mode=bytecode

Note: i386-win32 peak memory was not directly measured in this macOS worker, but the 32-bit large-address-aware flag was removed and the first-party interpreted/bytecode suites passed without conformance regressions.

@vercel

vercel Bot commented Jun 24, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
gocciascript-homepage Ignored Ignored Jun 24, 2026 5:44pm

Request Review

@coderabbitai

coderabbitai Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 51585d82-693e-4a36-90e0-cd4d8500b2de

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@github-actions

Copy link
Copy Markdown
Contributor

Benchmark Results

430 benchmarks

Interpreted: 🟢 32 improved · 🔴 29 regressed · 369 unchanged · avg +1.2%
Bytecode: 🟢 191 improved · 🔴 7 regressed · 232 unchanged · avg +8.5%

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

Deterministic profile diff

Deterministic profile diff: no significant changes.

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

@github-actions

Copy link
Copy Markdown
Contributor

Suite Timing

Test Runner (interpreted: 10,804 passed; bytecode: 10,804 passed)
Metric Interpreted Bytecode
Total 10804 10804
Passed 10804 ✅ 10804 ✅
Workers 4 4
Test Duration 15.63s 16.13s
Lex (cumulative) 485.2ms 521.7ms
Parse (cumulative) 340.8ms 356.4ms
Compile (cumulative) 738.8ms
Execute (cumulative) 153.4ms 34.17s
Engine Total (cumulative) 979.5ms 35.78s
Lex (avg/worker) 121.3ms 130.4ms
Parse (avg/worker) 85.2ms 89.1ms
Compile (avg/worker) 184.7ms
Execute (avg/worker) 38.3ms 8.54s
Engine Total (avg/worker) 244.9ms 8.95s

Memory

GC rows aggregate the main thread plus all worker thread-local GCs. Test runner worker shutdown frees thread-local heaps in bulk; that shutdown reclamation is not counted as GC collections or collected objects.

Metric Interpreted Bytecode
GC Live 271.71 MiB 269.47 MiB
GC Peak Live 300.55 MiB 291.98 MiB
GC Allocated During Run 434.01 MiB 425.72 MiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 188 188
GC Collected Objects 1,280,936 1,252,577
Heap Start Allocated 179.2 KiB 179.2 KiB
Heap End Allocated 3.65 MiB 3.65 MiB
Heap Delta Allocated 3.47 MiB 3.47 MiB
Heap Delta Free 1.59 MiB 1.59 MiB
Benchmarks (interpreted: 430; bytecode: 430)
Metric Interpreted Bytecode
Total 430 430
Workers 4 4
Duration 2.86min 2.79min

Memory

GC rows aggregate the main thread plus all worker thread-local GCs. Benchmark runner performs explicit between-file collections, so collection and collected-object counts can be much higher than the test runner.

Metric Interpreted Bytecode
GC Live 6.08 MiB 6.08 MiB
GC Peak Live 88.97 MiB 85.13 MiB
GC Allocated During Run 14.90 GiB 10.14 GiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 3,723 3,545
GC Collected Objects 233,713,286 225,357,538
Heap Start Allocated 3.35 MiB 3.35 MiB
Heap End Allocated 3.35 MiB 3.35 MiB
Heap Delta Allocated 128 B 128 B

Measured on ubuntu-latest x64.

@github-actions

Copy link
Copy Markdown
Contributor

test262 Conformance

🚫 Regression vs cached main baseline. 4 previously-passing test(s) now fail; pass count Δ +32. This run blocks merge — see "Newly failing" below.

Category Run Passed Δ Pass Failed Pass-rate Δ Rate
built-ins 23,643 22,516 +1 1,127 95.2% ±0pp
harness 116 116 ±0 0 100.0% ±0pp
intl402 3,341 3,330 -4 11 99.7% -0.1pp
language 23,711 23,706 +34 5 100.0% +0.1pp
staging 1,482 1,103 +1 377 74.4% +0.1pp
total 52,293 50,771 +32 1,520 97.1% +0.1pp

Areas closest to 100%

Area Pass rate Δ vs main Passing
built-ins/TypedArray 99.9% ±0pp 1,445 / 1,446
intl402/Temporal 99.8% -0.1pp 2,024 / 2,029
built-ins/Object 99.7% ±0pp 3,401 / 3,411
Per-test deltas (+36 / -4)

Newly failing (4):

  • intl402/Date/prototype/taint-Intl-DateTimeFormat.js
  • intl402/Number/prototype/toLocaleString/taint-Intl-NumberFormat.js
  • intl402/Temporal/ZonedDateTime/prototype/hoursInDay/dst-less-than-hour.js
  • intl402/Temporal/ZonedDateTime/prototype/hoursInDay/same-date-starts-twice.js

Newly passing (36):

  • built-ins/Number/prototype/toExponential/undefined-fractiondigits.js
  • language/expressions/call/tco-call-args.js
  • language/expressions/call/tco-member-args.js
  • language/expressions/call/tco-non-eval-function-dynamic.js
  • language/expressions/call/tco-non-eval-function.js
  • language/expressions/call/tco-non-eval-global.js
  • language/expressions/call/tco-non-eval-with.js
  • language/expressions/coalesce/tco-pos-null.js
  • language/expressions/coalesce/tco-pos-undefined.js
  • language/expressions/comma/tco-final.js
  • language/expressions/conditional/tco-cond.js
  • language/expressions/conditional/tco-pos.js
  • language/expressions/logical-and/tco-right.js
  • language/expressions/logical-or/tco-right.js
  • language/expressions/tagged-template/tco-call.js
  • language/expressions/tagged-template/tco-member.js
  • language/expressions/tco-pos.js
  • language/statements/block/tco-stmt-list.js
  • language/statements/block/tco-stmt.js
  • language/statements/do-while/tco-body.js
  • language/statements/for/tco-const-body.js
  • language/statements/for/tco-let-body.js
  • language/statements/for/tco-lhs-body.js
  • language/statements/for/tco-var-body.js
  • language/statements/if/tco-else-body.js
  • language/statements/if/tco-if-body.js
  • language/statements/labeled/tco.js
  • language/statements/return/tco.js
  • language/statements/switch/tco-case-body-dflt.js
  • language/statements/switch/tco-case-body.js
  • language/statements/switch/tco-dftl-body.js
  • language/statements/try/tco-catch-finally.js
  • language/statements/try/tco-catch.js
  • language/statements/try/tco-finally.js
  • language/statements/while/tco-body.js
  • staging/sm/TypedArray/set-same-buffer-different-source-target-types.js

Steady-state failures are non-blocking; regressions vs the cached main baseline (lower total pass count, or any PASS → non-PASS transition) fail the conformance gate. Measured on ubuntu-latest x64, bytecode mode. Areas grouped by the first two test262 path components; minimum 25 attempted tests, areas already at 100% excluded. Δ vs main compares against the most recent cached main baseline.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Test runner retains every per-engine heap per worker, peaking at the i386-win32 2 GB ceiling

1 participant