Skip to content

Simplify and harden lexer internals#674

Draft
frostney wants to merge 6 commits into
mainfrom
t3code/lexer-audit
Draft

Simplify and harden lexer internals#674
frostney wants to merge 6 commits into
mainfrom
t3code/lexer-audit

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented May 20, 2026

Summary

  • Simplify lexer internals by removing unused token state/types, eliminating the lexer keyword singleton, and using direct keyword classification.
  • Harden oversized braced unicode escapes so they fail with a lexer error instead of overflowing integer conversion.
  • Improve lexer performance on identifier-heavy input and numeric separator scanning while keeping rejected spikes out of the final diff.
  • Merge the latest origin/main into the PR branch and preserve main's Unicode identifier validation changes.
  • Documentation was not updated because this is internal lexer behavior with no public API/doc changes.

Testing

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

Commands run:

  • ./build.pas clean tests testrunner
  • ./build/Goccia.Lexer.Test
  • ./build/GocciaTestRunner tests --asi --unsafe-ffi --no-progress
  • ./format.pas --check
  • git diff --check

Benchmark note:

  • Compared this branch (85dac6c5) against latest origin/main (51ff745f) using the same 457 KB generated lexer-heavy JS source, 1 warmup + 20 measured GocciaScriptLoader --output=json runs per build.
  • Lex median improved from 38.77 ms on origin/main to 35.08 ms on this branch (~9.5% faster); lex average improved from 47.05 ms to 35.80 ms (~23.9% faster, with noisy main outliers).

@vercel
Copy link
Copy Markdown

vercel Bot commented May 20, 2026

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

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
gocciascript-homepage Ignored Ignored Preview May 20, 2026 9:37am

Request Review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 20, 2026

Important

Review skipped

Draft detected.

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

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 7dd2cadb-a43c-46c2-86b5-cbe1d79ead7e

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

# Conflicts:
#	source/units/Goccia.Lexer.pas
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 20, 2026

Benchmark Results

407 benchmarks

Interpreted: 🟢 32 improved · 🔴 129 regressed · 246 unchanged · avg -1.3%
Bytecode: 🟢 5 improved · 🔴 399 regressed · 3 unchanged · avg -21.6%

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

Deterministic profile diff

Deterministic profile diff: no significant changes.

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 20, 2026

Suite Timing

Test Runner (interpreted: 9,736 passed; bytecode: 9,736 passed)
Metric Interpreted Bytecode
Total 9736 9736
Passed 9736 ✅ 9736 ✅
Workers 4 4
Test Duration 3.11s 3.21s
Lex (cumulative) 387.3ms 332.8ms
Parse (cumulative) 266.5ms 300.8ms
Compile (cumulative) 662.3ms
Execute (cumulative) 4.13s 3.21s
Engine Total (cumulative) 4.79s 4.50s
Lex (avg/worker) 96.8ms 83.2ms
Parse (avg/worker) 66.6ms 75.2ms
Compile (avg/worker) 165.6ms
Execute (avg/worker) 1.03s 801.9ms
Engine Total (avg/worker) 1.20s 1.13s

Memory

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

Metric Interpreted Bytecode
GC Live 261.67 MiB 255.98 MiB
GC Peak Live 261.68 MiB 255.99 MiB
GC Allocated During Run 266.12 MiB 260.43 MiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 1 1
GC Collected Objects 88 88
Heap Start Allocated 159.6 KiB 159.6 KiB
Heap End Allocated 1.49 MiB 1.49 MiB
Heap Delta Allocated 1.34 MiB 1.34 MiB
Heap Delta Free 964.8 KiB 964.8 KiB
Benchmarks (interpreted: 407; bytecode: 407)
Metric Interpreted Bytecode
Total 407 407
Workers 4 4
Duration 2.44min 2.46min

Memory

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

Metric Interpreted Bytecode
GC Live 3.69 MiB 3.68 MiB
GC Peak Live 94.82 MiB 80.95 MiB
GC Allocated During Run 13.33 GiB 10.29 GiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 2,817 2,663
GC Collected Objects 251,039,271 255,022,047
Heap Start Allocated 1.23 MiB 1.23 MiB
Heap End Allocated 1.23 MiB 1.23 MiB
Heap Delta Allocated 128 B 128 B

Measured on ubuntu-latest x64.

- Build lexer keyword map from centralized reserved/contextual lists
- Replace parser reserved-word checks with shared helper
- Tokenize contextual keywords directly in the lexer
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 20, 2026

test262 Conformance

Category Run Passed Δ Pass Failed Pass-rate Δ Rate
built-ins 23,449 16,067 +1 7,377 68.5% ±0pp
harness 116 72 ±0 44 62.1% ±0pp
intl402 3,324 892 ±0 2,432 26.8% ±0pp
language 23,635 14,203 ±0 9,432 60.1% ±0pp
staging 1,484 571 ±0 910 38.5% ±0pp
total 52,008 31,805 +1 20,195 61.2% ±0pp

Areas closest to 100%

Area Pass rate Δ vs main Passing
built-ins/WeakMap 99.3% ±0pp 140 / 141
built-ins/WeakSet 98.8% ±0pp 84 / 85
language/future-reserved-words 98.1% ±0pp 53 / 54
Per-test deltas (+1 / -0)

Newly passing (1):

  • built-ins/Number/prototype/toExponential/undefined-fractiondigits.js

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

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant