Skip to content

feat(engine): add ShadowRealm behind --unsafe-shadowrealm#795

Draft
frostney wants to merge 1 commit into
mainfrom
claude/hopeful-mcnulty-217fab
Draft

feat(engine): add ShadowRealm behind --unsafe-shadowrealm#795
frostney wants to merge 1 commit into
mainfrom
claude/hopeful-mcnulty-217fab

Conversation

@frostney

Copy link
Copy Markdown
Owner

Summary

Implements the TC39 ShadowRealm proposal (stage 2.7) as an opt-in core language built-in, gated by a new --unsafe-shadowrealm flag / "unsafe-shadowrealm": true config key. It is off by default because ShadowRealm.prototype.evaluate performs dynamic source evaluation, which GocciaScript keeps out of normal runtimes — the same explicit-capability pattern as --unsafe-function-constructor.

What's implemented

  • globalThis.ShadowRealm constructor — engine-owned, installed only when the flag is set (genuinely absent otherwise). new required (ShadowRealm() throws TypeError); length 0, name "ShadowRealm", [[Prototype]] = Function.prototype; ShadowRealm.prototype[Symbol.toStringTag] = "ShadowRealm".
  • ShadowRealm.prototype.evaluate(sourceText) — runs source in a fresh child realm (its own intrinsics + global object) using eval-style declaration instantiation: var/function persist on the realm's globalThis, let/const are per-call. Parse failures throw a caller-realm SyntaxError; runtime errors throw a caller-realm TypeError. Nested realms are supported.
  • Cross-realm callable boundary as wrapped function exotic objects: primitives pass through, non-callable objects throw TypeError, callables are wrapped (name/length copied, arguments/results marshaled across realms, thrown errors re-wrapped into the caller realm).
  • test262 ShadowRealm / realms-tests features map to --unsafe-shadowrealm in the conformance runner.

Key implementation notes

  • Engine-owned rather than a runtime extension, because the runtime-less Bare Script Loader used by test262 has no runtime layer; each instance owns a child TGocciaEngine freed at the creating engine's teardown (a GC sweep can't safely free a child engine from a collected instance). See ADR 0070.
  • InvokeCallable now routes callable non-function/class values (e.g. callable proxies) through the proxy apply hook so wrapped callable proxies work — previously they raised "object is not a function".

Deferred / out of scope (follow-ups)

  • ShadowRealm.prototype.importValue (module import in the child realm) — a separate proposal method, not in this issue's expected behavior (~12 test262 cases).
  • Child realms intentionally do not expose eval, consistent with the no-eval default.
  • Cross-realm Symbol.for registry sharing — a pre-existing per-realm limitation also visible via $262.createRealm.
  • Strict-mode early errors (e.g. assigning to arguments) and native-function length deletability are pre-existing engine limitations surfaced by a few test262 cases.
  • FWrappedHosts retains wrapped-function state for the realm's lifetime (memory bounded by engine lifetime; candidate for a future GC-owned wrapper).

Closes #777

Testing

  • Verified no regressions and confirmed the new feature or bugfix in end-to-end JavaScript/TypeScript tests — full JS suite 10834/10834 passing in both interpreter and bytecode modes; 35 new tests/built-ins/ShadowRealm/** tests. test262 built-ins/ShadowRealm at the pinned SHA: 48/64 (was 0/64), 0 wrapper-infra failures; the remaining 16 are the deferred importValue (12) and the pre-existing-limitation edge cases (4) noted above. ./format.pas --check clean.
  • Updated documentation — docs/built-ins.md, docs/language-tables.md, docs/build-system.md, and ADR 0070.
  • Optional: Verified no regressions and confirmed the new feature or bugfix in native Pascal tests (if AST, scope, evaluator, or value types changed) — n/a; additive built-in, no AST/scope/value-type changes.
  • Optional: Verified no benchmark regressions or confirmed benchmark coverage for the change — n/a.

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@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 7:48pm

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: ad32b141-7a27-4eb6-8b91-25506f71c510

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: 🟢 233 improved · 🔴 10 regressed · 187 unchanged · avg +12.0%
Bytecode: 🟢 6 improved · 🔴 402 regressed · 22 unchanged · avg -29.4%

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

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,834 passed; bytecode: 10,834 passed)
Metric Interpreted Bytecode
Total 10834 10834
Passed 10834 ✅ 10834 ✅
Workers 4 4
Test Duration 16.73s 18.23s
Lex (cumulative) 555.6ms 520.4ms
Parse (cumulative) 376.4ms 365.9ms
Compile (cumulative) 765.7ms
Execute (cumulative) 115.3ms 41.13s
Engine Total (cumulative) 1.05s 42.78s
Lex (avg/worker) 138.9ms 130.1ms
Parse (avg/worker) 94.1ms 91.5ms
Compile (avg/worker) 191.4ms
Execute (avg/worker) 28.8ms 10.28s
Engine Total (avg/worker) 261.8ms 10.70s

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 276.54 MiB 274.30 MiB
GC Peak Live 305.51 MiB 295.70 MiB
GC Allocated During Run 439.62 MiB 431.32 MiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 188 188
GC Collected Objects 1,285,538 1,257,105
Heap Start Allocated 179.3 KiB 179.3 KiB
Heap End Allocated 3.65 MiB 3.65 MiB
Heap Delta Allocated 3.47 MiB 3.47 MiB
Heap Delta Free 1.71 MiB 1.71 MiB
Benchmarks (interpreted: 430; bytecode: 430)
Metric Interpreted Bytecode
Total 430 430
Workers 4 4
Duration 3.01min 2.77min

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 108.91 MiB 81.92 MiB
GC Allocated During Run 15.58 GiB 9.47 GiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 3,741 3,463
GC Collected Objects 244,607,546 208,306,848
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. 5 previously-passing test(s) now fail; pass count Δ +78. This run blocks merge — see "Newly failing" below.

Category Run Passed Δ Pass Failed Pass-rate Δ Rate
built-ins 23,643 22,564 +46 1,079 95.4% +0.2pp
harness 116 116 ±0 0 100.0% ±0pp
intl402 3,341 3,332 -2 9 99.7% -0.1pp
language 23,711 23,706 +34 5 100.0% +0.1pp
staging 1,482 1,103 ±0 377 74.4% ±0pp
total 52,293 50,821 +78 1,470 97.2% +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 (+83 / -5)

Newly failing (5):

  • built-ins/ArrayBuffer/prototype/transferToImmutable/new-length-coercion.js
  • built-ins/Number/string-binary-literal.js
  • built-ins/Number/string-octal-literal.js
  • intl402/Temporal/ZonedDateTime/prototype/hoursInDay/dst-less-than-hour.js
  • intl402/Temporal/ZonedDateTime/prototype/hoursInDay/same-date-starts-twice.js

Newly passing (83):

  • built-ins/Number/prototype/toExponential/undefined-fractiondigits.js
  • built-ins/ShadowRealm/constructor.js
  • built-ins/ShadowRealm/descriptor.js
  • built-ins/ShadowRealm/extensibility.js
  • built-ins/ShadowRealm/instance-extensibility.js
  • built-ins/ShadowRealm/instance.js
  • built-ins/ShadowRealm/length.js
  • built-ins/ShadowRealm/name.js
  • built-ins/ShadowRealm/proto.js
  • built-ins/ShadowRealm/prototype/evaluate/descriptor.js
  • built-ins/ShadowRealm/prototype/evaluate/errors-from-the-other-realm-is-wrapped-into-a-typeerror.js
  • built-ins/ShadowRealm/prototype/evaluate/globalthis-config-only-properties.js
  • built-ins/ShadowRealm/prototype/evaluate/globalthis-ordinary-object.js
  • built-ins/ShadowRealm/prototype/evaluate/length.js
  • built-ins/ShadowRealm/prototype/evaluate/name.js
  • built-ins/ShadowRealm/prototype/evaluate/nested-realms.js
  • built-ins/ShadowRealm/prototype/evaluate/no-conditional-strict-mode.js
  • built-ins/ShadowRealm/prototype/evaluate/not-constructor.js
  • built-ins/ShadowRealm/prototype/evaluate/proto.js
  • built-ins/ShadowRealm/prototype/evaluate/returns-primitive-values.js
  • built-ins/ShadowRealm/prototype/evaluate/returns-proxy-callable-object.js
  • built-ins/ShadowRealm/prototype/evaluate/throws-error-from-ctor-realm.js
  • built-ins/ShadowRealm/prototype/evaluate/throws-typeerror-if-evaluation-resolves-to-non-primitive.js
  • built-ins/ShadowRealm/prototype/evaluate/throws-typeerror-wrap-throwing.js
  • built-ins/ShadowRealm/prototype/evaluate/throws-when-argument-is-not-a-string.js
  • built-ins/ShadowRealm/prototype/evaluate/validates-realm-object.js
  • built-ins/ShadowRealm/prototype/evaluate/wrapped-function-arguments-are-wrapped-into-the-inner-realm-extended.js
  • built-ins/ShadowRealm/prototype/evaluate/wrapped-function-arguments-are-wrapped-into-the-inner-realm.js
  • built-ins/ShadowRealm/prototype/evaluate/wrapped-function-from-return-values-share-no-identity.js
  • built-ins/ShadowRealm/prototype/evaluate/wrapped-function-multiple-different-realms-nested.js
  • built-ins/ShadowRealm/prototype/evaluate/wrapped-function-multiple-different-realms.js
  • built-ins/ShadowRealm/prototype/evaluate/wrapped-function-observing-their-scopes.js
  • built-ins/ShadowRealm/prototype/evaluate/wrapped-function-proto-from-caller-realm.js
  • built-ins/ShadowRealm/prototype/evaluate/wrapped-function-proxied-observes-boundary.js
  • built-ins/ShadowRealm/prototype/evaluate/wrapped-function-throws-typeerror-from-caller-realm.js
  • built-ins/ShadowRealm/prototype/evaluate/wrapped-function-throws-typeerror-on-exceptional-exit.js
  • built-ins/ShadowRealm/prototype/evaluate/wrapped-function-throws-typeerror-on-non-primitive-arguments.js
  • built-ins/ShadowRealm/prototype/evaluate/wrapped-function-throws-typeerror-on-non-primitive-returns.js
  • built-ins/ShadowRealm/prototype/evaluate/wrapped-functions-accepts-callable-objects.js
  • built-ins/ShadowRealm/prototype/evaluate/wrapped-functions-can-resolve-callable-returns.js
  • built-ins/ShadowRealm/prototype/evaluate/wrapped-functions-new-wrapping-on-each-evaluation.js
  • built-ins/ShadowRealm/prototype/evaluate/wrapped-functions-share-no-properties-extended.js
  • built-ins/ShadowRealm/prototype/evaluate/wrapped-functions-share-no-properties.js
  • built-ins/ShadowRealm/prototype/proto.js
  • built-ins/ShadowRealm/prototype/Symbol.toStringTag.js
  • built-ins/ShadowRealm/WrappedFunction/length-throws-typeerror.js
  • built-ins/ShadowRealm/WrappedFunction/name-throws-typeerror.js
  • built-ins/ShadowRealm/WrappedFunction/name.js
  • built-ins/ShadowRealm/WrappedFunction/throws-typeerror-on-revoked-proxy.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

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.

Implement ShadowRealm behind an explicit unsafe flag

1 participant