Skip to content

Streamline project docs and contributor guidance#250

Merged
frostney merged 4 commits into
mainfrom
t3code/docs-cleanup
Apr 9, 2026
Merged

Streamline project docs and contributor guidance#250
frostney merged 4 commits into
mainfrom
t3code/docs-cleanup

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Apr 9, 2026

Summary

  • Reorganized AGENTS.md to make core contributor rules, GC notes, language restrictions, and design patterns easier to scan.
  • Tightened and shortened the top-level docs in README.md while pushing detailed references into the dedicated pages under docs/.
  • Updated several documentation pages to improve cross-links and keep the main entry points aligned with the current project layout.

Testing

  • Not run (documentation-only changes).
  • Checked that the affected docs files were updated consistently across AGENTS.md, README.md, and docs/.

- Consolidate AGENTS guidance and architecture notes
- Trim duplicated detail across docs and align references
- Update built-in, GC, types, decorators, and platform sections
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 9, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: c4852086-cf1e-4da1-93d1-74203679cc8a

📥 Commits

Reviewing files that changed from the base of the PR and between 18a3825 and 5200f58.

📒 Files selected for processing (1)
  • docs/language-restrictions.md
✅ Files skipped from review due to trivial changes (1)
  • docs/language-restrictions.md

📝 Walkthrough

Walkthrough

Added concise "Executive Summary" sections across many docs, documented new built-ins and flags (Proxy, Reflect, FFI, JSONL), condensed and relocated detailed design/GC/language specifics into targeted docs, and updated documented DefaultGlobals; no code or public API declarations changed.

Changes

Cohort / File(s) Summary
Top-level Docs — Executive Summaries
docs/adding-built-in-types.md, docs/architecture.md, docs/benchmarks.md, docs/build-system.md, docs/code-style.md, docs/decision-log.md, docs/profiling.md, docs/testing.md, docs/tutorial.md, docs/value-system.md
Inserted concise "Executive Summary" sections summarizing architecture, build/test/profile, value-system, and style guidance.
AGENTS and Core Reorganization
AGENTS.md
Condensed extensive inline specifications (GC details, types-as-comments, decorators, this binding, platform pitfalls, JSX/testing/build docs) into shorter rules and pointers to targeted docs.
README updates
README.md
Expanded documented built-ins to include Proxy and Reflect; removed explicit WASM-emission statement; shortened "Quick Tour" examples and replaced structured-data/text-asset details with brief parser/module summaries.
Built-ins & Embedding
docs/built-ins.md, docs/embedding.md
Added FFI and Proxy documentation (APIs, traps, flags); introduced/updated built-in flags ggProxy, ggFFI, ggJSONL, ggReflect; added these to documented DefaultGlobals.
Bytecode / VM / Language
docs/bytecode-vm.md, docs/design-decisions.md, docs/language-restrictions.md
Added executive summaries describing bytecode VM, opcode space, and register-based rationale; adjusted WASM wording; expanded RegExp flag coverage and clarified u/v semantics.
Docs: Benchmarks / Build / Profiling / Testing
docs/benchmarks.md, docs/build-system.md, docs/profiling.md, docs/testing.md
Added summaries and brief usage/option descriptions for benchmarks (formats, CI integration), build modes/CI split, profiling modes/outputs, and test conventions.
Value-system & Built-in types guidance
docs/value-system.md, docs/adding-built-in-types.md
Added executive summaries and a compact recipe/checklist for adding built-in types and value-system integration (GC pinning, prototype singletons, MarkReferences usage).

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Description check ❓ Inconclusive The description covers the Summary section well but does not complete the Testing checklist section with proper checkboxes or documentation updates information as specified in the template. Complete the Testing section with clear checkbox states and confirm that documentation updates meet the template requirements.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Streamline project docs and contributor guidance' accurately summarizes the main change: documentation reorganization and improvements across multiple files.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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


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

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🧹 Nitpick comments (1)
docs/decision-log.md (1)

7-8: Clarify VM value model (registers are not TGocciaValue directly).

Line 7 says bytecode execution operates directly on TGocciaValue, which conflicts with the current VM model (TGocciaRegister register file, with TGocciaValue materialization at runtime boundaries). Please reword to avoid architectural drift.

Suggested wording adjustment
-- **Bytecode fold-in** — The bytecode backend is now Goccia-owned, operating directly on `TGocciaValue` with dedicated opcodes
+- **Bytecode fold-in** — The bytecode backend is now Goccia-owned, using dedicated opcodes over tagged VM registers (`TGocciaRegister`) while materializing `TGocciaValue` at object/runtime boundaries
Based on learnings: In frostney/GocciaScript (units/Goccia.VM*.pas), the bytecode VM register file uses a tagged `TGocciaRegister` type, not `TGocciaValue` directly.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/decision-log.md` around lines 7 - 8, Update the decision log wording to
reflect the actual VM value model: replace the assertion that the bytecode
backend "operates directly on TGocciaValue" with wording that the bytecode VM
uses a tagged TGocciaRegister register file and only materializes TGocciaValue
at runtime boundaries; reference the bytecode backend and the types
TGocciaRegister and TGocciaValue (and TGocciaControlFlow if present) so the log
accurately states registers hold TGocciaRegister entries and TGocciaValue
materialization occurs at boundary points rather than direct register storage.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/built-ins.md`:
- Line 8: The executive summary incorrectly states "22 built-in flags" while the
TGocciaGlobalBuiltin enum actually defines 23 entries; update the wording in
docs/built-ins.md to reflect 23 built-in flags and/or explicitly mention both
ggTestAssertions and ggBenchmark so the count matches the TGocciaGlobalBuiltin
enum definition (ensure the list of names corresponds to the enum entries).

In `@docs/bytecode-vm.md`:
- Line 9: Update the docs to reflect the three-tier opcode split used in the
codebase: change the opcode range sentence to state core instructions are
0..127, non-core generic arithmetic/bitwise are 128..166, and semantic/helper
ops start at 167..255 (matching OP_SEM_FIRST = 167 in
units/Goccia.Bytecode.pas); reference OP_SEM_FIRST and the three ranges (0..127,
128..166, 167..255) in the wording so the doc aligns exactly with the
implementation.

In `@docs/language-restrictions.md`:
- Line 9: Update the "Graceful handling — Excluded syntax parses successfully
but executes as a no-op with a warning and suggestion" line to narrow the claim
to only parser-recognized exclusions (e.g., change wording to something like
"Graceful handling — Some parser-recognized excluded syntax parses successfully
but is treated as a no-op with a warning and suggestion") so it no longer
implies blanket no-op behavior for exclusions such as eval or arguments; locate
and edit the exact "Graceful handling — Excluded syntax parses successfully but
executes as a no-op with a warning and suggestion" phrase in the document and
replace it with the qualified wording.

In `@docs/testing.md`:
- Line 10: Update the documented full-suite command string `./build.pas
testrunner && ./build/TestRunner tests` to include the `--asi` flag (e.g.,
`./build.pas testrunner && ./build/TestRunner tests --asi`) or alternatively add
an explicit one-line caveat after that command stating that the full suite
requires `--asi` so ASI tests under `tests/language/asi/` run successfully; edit
the single occurrence of the command in the docs/testing.md content to make this
change.

---

Nitpick comments:
In `@docs/decision-log.md`:
- Around line 7-8: Update the decision log wording to reflect the actual VM
value model: replace the assertion that the bytecode backend "operates directly
on TGocciaValue" with wording that the bytecode VM uses a tagged TGocciaRegister
register file and only materializes TGocciaValue at runtime boundaries;
reference the bytecode backend and the types TGocciaRegister and TGocciaValue
(and TGocciaControlFlow if present) so the log accurately states registers hold
TGocciaRegister entries and TGocciaValue materialization occurs at boundary
points rather than direct register storage.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 29f6ea78-4d97-4406-828d-ff6de3d78dc8

📥 Commits

Reviewing files that changed from the base of the PR and between a2e0d0e and d1245d5.

📒 Files selected for processing (17)
  • AGENTS.md
  • README.md
  • docs/adding-built-in-types.md
  • docs/architecture.md
  • docs/benchmarks.md
  • docs/build-system.md
  • docs/built-ins.md
  • docs/bytecode-vm.md
  • docs/code-style.md
  • docs/decision-log.md
  • docs/design-decisions.md
  • docs/embedding.md
  • docs/language-restrictions.md
  • docs/profiling.md
  • docs/testing.md
  • docs/tutorial.md
  • docs/value-system.md

Comment thread docs/built-ins.md Outdated
Comment thread docs/bytecode-vm.md Outdated
Comment thread docs/language-restrictions.md Outdated
Comment thread docs/testing.md Outdated
frostney and others added 2 commits April 9, 2026 15:48
Resolve conflict in AGENTS.md Build System section: keep trimmed
format from docs-cleanup, incorporate new changelog line from main
(git-cliff, #248). Error.cause (#249) already documented.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Fix built-in flag count 22→23 in built-ins.md executive summary
- Correct opcode space to three-tier split (0-127 core, 128-166
  non-core, 167-255 semantic) in bytecode-vm.md
- Narrow graceful handling claim to parser-recognized exclusions
  in language-restrictions.md
- Add --asi flag to default test command in testing.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/language-restrictions.md`:
- Line 10: Update the wording to separate actual opt-in flags from
always-available language features: list ASI (`--asi`) and JSX (`ggJSX`) as the
only opt-in toggles, and move decorators, enums, and "types as comments" out of
the opt-in group into an "always available" or "language features" group;
explicitly state that GocciaScript supports TC39 Stage 3 decorators and
decorator metadata and the TC39 "Types as Comments" proposal to reflect current
support.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 0ac5b14a-ca51-436a-aa5b-1a72394eacd4

📥 Commits

Reviewing files that changed from the base of the PR and between d1245d5 and 18a3825.

📒 Files selected for processing (6)
  • AGENTS.md
  • docs/build-system.md
  • docs/built-ins.md
  • docs/bytecode-vm.md
  • docs/language-restrictions.md
  • docs/testing.md
✅ Files skipped from review due to trivial changes (4)
  • docs/build-system.md
  • docs/testing.md
  • docs/bytecode-vm.md
  • docs/built-ins.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • AGENTS.md

Comment thread docs/language-restrictions.md Outdated
Split the executive summary bullet in language-restrictions.md: ASI and
JSX are opt-in toggles (--asi flag, ggJSX flag), while types as
comments, decorators, and enums are always-available language features
with no gating flag.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 9, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 4109 4109
Tests Passed 4068 ✅ 4109 ✅
Tests Skipped 41 0
Tests Test Duration 282.4ms 282.4ms
Tests Lex 80.0ms 54.8ms
Tests Parse 104.7ms 101.6ms
Tests Compile 64.0ms
Tests Execute 297.1ms 312.7ms
Tests Engine Total 481.7ms 533.1ms
Benchmarks Total 274 274
Benchmarks Duration 7.46min 6.97min

Measured on ubuntu-latest x64.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 9, 2026

Benchmark Results

274 benchmarks

Interpreted: 🟢 31 improved · 🔴 194 regressed · 49 unchanged · avg -4.2%
Bytecode: 🟢 265 improved · 🔴 1 regressed · 8 unchanged · avg +21.8%

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

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

@frostney frostney merged commit 4565a79 into main Apr 9, 2026
9 checks passed
@frostney frostney deleted the t3code/docs-cleanup branch April 9, 2026 15:37
@coderabbitai coderabbitai Bot mentioned this pull request Apr 14, 2026
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.

1 participant