Skip to content

Enable strict types by default for bytecode executor#336

Merged
frostney merged 2 commits into
mainfrom
t3code/bytecode-strictness-tests
Apr 18, 2026
Merged

Enable strict types by default for bytecode executor#336
frostney merged 2 commits into
mainfrom
t3code/bytecode-strictness-tests

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Apr 18, 2026

Summary

  • Add a DefaultStrictTypes hook to executors so engine initialization can derive the strict-type default from the active backend.
  • Make the bytecode executor opt into strict types by default.
  • Preserve the existing False default for other executors.

- Add executor hook for default strict type mode
- Let engine initialize strict typing from the active executor
- Keep interpreter-backed execution defaulting to false
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 18, 2026

📝 Walkthrough

Walkthrough

Executors now expose a virtual DefaultStrictTypes: Boolean. The base executor returns False; TGocciaBytecodeExecutor overrides it to return True. TGocciaEngine.Initialize uses the executor's DefaultStrictTypes when an executor is present to set FStrictTypes. Tests added to verify behavior.

Changes

Cohort / File(s) Summary
Executor core & integration
source/units/Goccia.Executor.pas, source/units/Goccia.Engine.pas
Added virtual DefaultStrictTypes: Boolean to TGocciaExecutor (default False) and updated TGocciaEngine.Initialize to set FStrictTypes from the executor when assigned.
Bytecode executor override
source/units/Goccia.Engine.Backend.pas
TGocciaBytecodeExecutor now overrides DefaultStrictTypes to return True.
Tests
source/units/Goccia.Engine.StrictTypes.Test.pas
Added test suite verifying default executor yields StrictTypes = False and bytecode executor yields StrictTypes = True.

Sequence Diagram(s)

sequenceDiagram
    participant Test as Test Runner
    participant Engine as TGocciaEngine
    participant Executor as TGocciaExecutor
    participant BExecutor as TGocciaBytecodeExecutor

    Test->>Engine: Create(Executor=nil) / Create(Executor=instance)
    Engine->>Executor: DefaultStrictTypes()
    alt Executor is TGocciaBytecodeExecutor (override)
        BExecutor-->>Engine: True
        Engine->>Engine: FStrictTypes := True
    else Default executor implementation
        Executor-->>Engine: False
        Engine->>Engine: FStrictTypes := False
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested labels

new feature

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Description check ❓ Inconclusive The description covers the key changes but lacks testing verification details and documentation updates specified in the template. Clarify which testing procedures were followed (end-to-end tests, Pascal tests, or both) and confirm whether documentation was updated per template requirements.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the main change: enabling strict types by default for the bytecode executor.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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


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

@coderabbitai coderabbitai Bot added the internal Refactoring, CI, tooling, cleanup label Apr 18, 2026
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.

🧹 Nitpick comments (1)
source/units/Goccia.Engine.pas (1)

589-592: Add regression coverage for executor-driven strict defaults.

Lines 589-592 are correct, but this behavior shift should be locked with tests for both paths: interpreter/default executor (False) and bytecode executor (True).

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

In `@source/units/Goccia.Engine.pas` around lines 589 - 592, Add regression tests
that assert the FStrictTypes behavior when an executor is present vs nil: create
two unit tests exercising the constructor/initialization logic that reads
FExecutor and sets FStrictTypes (the code that checks Assigned(FExecutor) and
uses FExecutor.DefaultStrictTypes). One test should leave FExecutor nil (or use
the interpreter/default executor) and assert FStrictTypes = False; the other
should attach a bytecode executor mock/instance where DefaultStrictTypes returns
True and assert FStrictTypes = True. Use the engine class creating path that
initializes FExecutor/FStrictTypes so the tests fail if the executor-driven
default behavior changes.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@source/units/Goccia.Engine.pas`:
- Around line 589-592: Add regression tests that assert the FStrictTypes
behavior when an executor is present vs nil: create two unit tests exercising
the constructor/initialization logic that reads FExecutor and sets FStrictTypes
(the code that checks Assigned(FExecutor) and uses
FExecutor.DefaultStrictTypes). One test should leave FExecutor nil (or use the
interpreter/default executor) and assert FStrictTypes = False; the other should
attach a bytecode executor mock/instance where DefaultStrictTypes returns True
and assert FStrictTypes = True. Use the engine class creating path that
initializes FExecutor/FStrictTypes so the tests fail if the executor-driven
default behavior changes.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: f291db8f-8dd9-4830-b866-7e9ef29cbfd1

📥 Commits

Reviewing files that changed from the base of the PR and between 95c6a29 and 40fb113.

📒 Files selected for processing (3)
  • source/units/Goccia.Engine.Backend.pas
  • source/units/Goccia.Engine.pas
  • source/units/Goccia.Executor.pas

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 18, 2026

Benchmark Results

364 benchmarks

Interpreted: 🟢 28 improved · 🔴 102 regressed · 234 unchanged · avg -1.4%
Bytecode: 🟢 31 improved · 🔴 282 regressed · 51 unchanged · avg -6.2%

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

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 18, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 5469 5469
Tests Passed 5428 ✅ 5469 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 1.10s 1.20s
Tests Lex (cumulative) 178.3ms 123.6ms
Tests Parse (cumulative) 234.1ms 228.3ms
Tests Compile (cumulative) 163.9ms
Tests Execute (cumulative) 894.7ms 954.5ms
Tests Engine Total (cumulative) 1.31s 1.47s
Tests Lex (avg/worker) 44.6ms 30.9ms
Tests Parse (avg/worker) 58.5ms 57.1ms
Tests Compile (avg/worker) 41.0ms
Tests Execute (avg/worker) 223.7ms 238.6ms
Tests Engine Total (avg/worker) 326.8ms 367.6ms
Benchmarks Total 364 364
Benchmarks Workers 4 4
Benchmarks Duration 2.94min 2.83min

Measured on ubuntu-latest x64.

- Verify interpreter engines default StrictTypes to false
- Verify bytecode executors enable StrictTypes
@coderabbitai coderabbitai Bot added the new feature New feature or request label Apr 18, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

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

Inline comments:
In `@source/units/Goccia.Engine.StrictTypes.Test.pas`:
- Around line 45-47: Initialize object references to nil and open the try block
before calling constructors to make test setup exception-safe: set Source :=
nil; Executor := nil (or Engine := nil) at declaration, then begin try
immediately, then call Source := CreateEmptySource and Engine :=
TGocciaEngine.Create('<strict-test>', Source, []); finally free in the finally
block; similarly update the other occurrence (the block around lines 61-64) to
follow the same pattern so constructed objects are not leaked if a constructor
raises.
🪄 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: 564a8dbd-3561-49ce-a3dd-410b10f4ec5a

📥 Commits

Reviewing files that changed from the base of the PR and between 40fb113 and a9feb86.

📒 Files selected for processing (1)
  • source/units/Goccia.Engine.StrictTypes.Test.pas

Comment thread source/units/Goccia.Engine.StrictTypes.Test.pas
@frostney frostney merged commit eead245 into main Apr 18, 2026
10 checks passed
@frostney frostney deleted the t3code/bytecode-strictness-tests branch April 18, 2026 12:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

internal Refactoring, CI, tooling, cleanup new feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant