perf(parser): avoid vectors for single parenthesized expressions (#28374)

Avoid allocating a temporary arena vector for a single parenthesized
expression.

Depends on #28373. AI-assisted implementation.
This commit is contained in:
Boshen authored and GitHub committed 2026-10-29 16:30:23 +08:00
1 parent 50bd0a951a
commit c2d663de29
6 files changed
+59 -51

No files matched your search

+22 -14
View File
@@ -322,13 +322,30 @@ impl<'a, C: Config> ParserImpl<'a, C> {
self.lexer.trivia_builder.previous_token_no_side_effects_comments();
self.bump_any(); // `bump` `(`
let expr_start = self.cur_start();
let (mut expressions, comma_start) = self.context(Context::In, Context::Decorator, |p| {
p.parse_delimited_list(
let (expression, comma_start) = self.context(Context::In, Context::Decorator, |p| {
if p.at(Kind::RParen) || p.has_fatal_error() {
return (None, None);
}
let first = p.parse_assignment_expression_or_higher();
// A single parenthesized expression does not need a temporary arena vector.
if p.at(Kind::RParen) || p.has_fatal_error() {
return (Some(first), None);
}
let mut expressions = ArenaVec::with_capacity_in(2, p);
expressions.push(first);
let comma_start = p.parse_delimited_list_rest(
&mut expressions,
Kind::RParen,
Kind::Comma,
opening_span,
Self::parse_assignment_expression_or_higher,
)
);
let expression = if expressions.len() == 1 {
expressions.remove(0)
} else {
Expression::new_sequence_expression(p.end_span(expr_start), expressions, p)
};
(Some(expression), comma_start)
});
if let Some(comma_start) = comma_start {
@@ -339,21 +356,12 @@ impl<'a, C: Config> ParserImpl<'a, C> {
return self.fatal_error(error);
}
if expressions.is_empty() {
let Some(mut expression) = expression else {
self.expect(Kind::RParen);
let error = diagnostics::empty_parenthesized_expression(self.end_span(start));
return self.fatal_error(error);
}
let expr_span = self.end_span(expr_start);
self.expect(Kind::RParen);
// ParenthesizedExpression is from acorn --preserveParens
let mut expression = if expressions.len() == 1 {
expressions.remove(0)
} else {
Expression::new_sequence_expression(expr_span, expressions, self)
};
self.expect(Kind::RParen);
match &mut expression {
Expression::ArrowFunctionExpression(arrow_expr) => {
@@ -7,7 +7,7 @@ checker.ts:
sys peak growth: 2973842 # 2.97 MB
arena allocs: 36968
arena reallocs: 927
arena size: 38546952 # 38.55 MB
arena size: 38503224 # 38.50 MB
App.tsx:
file size: 415342 # 415.34 kB
@@ -18,7 +18,7 @@ App.tsx:
sys peak growth: 435478 # 435.48 kB
arena allocs: 11511
arena reallocs: 362
arena size: 7071288 # 7.07 MB
arena size: 7067944 # 7.07 MB
RadixUIAdoptionSection.jsx:
file size: 2520 # 2.52 kB
@@ -40,7 +40,7 @@ pdf.mjs:
sys peak growth: 1156488 # 1.16 MB
arena allocs: 21652
arena reallocs: 402
arena size: 11012784 # 11.01 MB
arena size: 11006048 # 11.01 MB
antd.js:
file size: 6686316 # 6.69 MB
@@ -51,7 +51,7 @@ antd.js:
sys peak growth: 13710144 # 13.71 MB
arena allocs: 120676
arena reallocs: 1889
arena size: 114439144 # 114.44 MB
arena size: 114354248 # 114.35 MB
binder.ts:
file size: 193077 # 193.08 kB
@@ -62,7 +62,7 @@ binder.ts:
sys peak growth: 195197 # 195.20 kB
arena allocs: 2092
arena reallocs: 38
arena size: 2539336 # 2.54 MB
arena size: 2537384 # 2.54 MB
kitchen-sink.tsx:
file size: 732898 # 732.90 kB
@@ -73,4 +73,4 @@ kitchen-sink.tsx:
sys peak growth: 1491884 # 1.49 MB
arena allocs: 30654
arena reallocs: 975
arena size: 14548696 # 14.55 MB
arena size: 14537304 # 14.54 MB
@@ -7,7 +7,7 @@ checker.ts:
sys peak growth: 10169560 # 10.17 MB
arena allocs: 56228
arena reallocs: 5084
arena size: 16382912 # 16.38 MB
arena size: 16339184 # 16.34 MB
App.tsx:
file size: 415342 # 415.34 kB
@@ -18,7 +18,7 @@ App.tsx:
sys peak growth: 1612427 # 1.61 MB
arena allocs: 7729
arena reallocs: 920
arena size: 2767000 # 2.77 MB
arena size: 2763656 # 2.76 MB
RadixUIAdoptionSection.jsx:
file size: 2520 # 2.52 kB
@@ -40,7 +40,7 @@ pdf.mjs:
sys peak growth: 3693355 # 3.69 MB
arena allocs: 19582
arena reallocs: 2574
arena size: 5691208 # 5.69 MB
arena size: 5684472 # 5.68 MB
antd.js:
file size: 6686316 # 6.69 MB
@@ -51,7 +51,7 @@ antd.js:
sys peak growth: 19934725 # 19.93 MB
arena allocs: 175842
arena reallocs: 34169
arena size: 43723680 # 43.72 MB
arena size: 43638784 # 43.64 MB
binder.ts:
file size: 193077 # 193.08 kB
@@ -62,7 +62,7 @@ binder.ts:
sys peak growth: 657404 # 657.40 kB
arena allocs: 2930
arena reallocs: 244
arena size: 1086224 # 1.09 MB
arena size: 1084272 # 1.08 MB
kitchen-sink.tsx:
file size: 732898 # 732.90 kB
@@ -73,4 +73,4 @@ kitchen-sink.tsx:
sys peak growth: 3707425 # 3.71 MB
arena allocs: 31100
arena reallocs: 3011
arena size: 8413432 # 8.41 MB
arena size: 8402040 # 8.40 MB
@@ -5,9 +5,9 @@ checker.ts:
sys deallocs: 19
sys alloc bytes: 4820 # 4.82 kB
sys peak growth: 2432 # 2.43 kB
arena allocs: 262590
arena allocs: 259857
arena reallocs: 15233
arena size: 12936672 # 12.94 MB
arena size: 12892944 # 12.89 MB
App.tsx:
file size: 415342 # 415.34 kB
@@ -16,9 +16,9 @@ App.tsx:
sys deallocs: 18
sys alloc bytes: 4348 # 4.35 kB
sys peak growth: 1868 # 1.87 kB
arena allocs: 44037
arena allocs: 43828
arena reallocs: 2263
arena size: 2231808 # 2.23 MB
arena size: 2228464 # 2.23 MB
RadixUIAdoptionSection.jsx:
file size: 2520 # 2.52 kB
@@ -27,7 +27,7 @@ RadixUIAdoptionSection.jsx:
sys deallocs: 1
sys alloc bytes: 108 # 108 B
sys peak growth: 108 # 108 B
arena allocs: 367
arena allocs: 366
arena reallocs: 58
arena size: 21200 # 21.20 kB
@@ -38,9 +38,9 @@ pdf.mjs:
sys deallocs: 67
sys alloc bytes: 24020 # 24.02 kB
sys peak growth: 12140 # 12.14 kB
arena allocs: 89857
arena allocs: 89436
arena reallocs: 5904
arena size: 4517312 # 4.52 MB
arena size: 4510576 # 4.51 MB
antd.js:
file size: 6686316 # 6.69 MB
@@ -49,9 +49,9 @@ antd.js:
sys deallocs: 185
sys alloc bytes: 109952 # 109.95 kB
sys peak growth: 48264 # 48.26 kB
arena allocs: 528577
arena allocs: 523271
arena reallocs: 35629
arena size: 30154616 # 30.15 MB
arena size: 30069720 # 30.07 MB
binder.ts:
file size: 193077 # 193.08 kB
@@ -60,9 +60,9 @@ binder.ts:
sys deallocs: 0
sys alloc bytes: 3016 # 3.02 kB
sys peak growth: 251 # 251 B
arena allocs: 16587
arena allocs: 16465
arena reallocs: 1093
arena size: 917920 # 917.92 kB
arena size: 915968 # 915.97 kB
kitchen-sink.tsx:
file size: 732898 # 732.90 kB
@@ -71,6 +71,6 @@ kitchen-sink.tsx:
sys deallocs: 183
sys alloc bytes: 34053 # 34.05 kB
sys peak growth: 3892 # 3.89 kB
arena allocs: 136453
arena allocs: 135741
arena reallocs: 8759
arena size: 6409648 # 6.41 MB
arena size: 6398256 # 6.40 MB
@@ -7,7 +7,7 @@ checker.ts:
sys peak growth: 3858362 # 3.86 MB
arena allocs: 0
arena reallocs: 0
arena size: 12936672 # 12.94 MB
arena size: 12892944 # 12.89 MB
App.tsx:
file size: 415342 # 415.34 kB
@@ -18,7 +18,7 @@ App.tsx:
sys peak growth: 360848 # 360.85 kB
arena allocs: 0
arena reallocs: 0
arena size: 2231808 # 2.23 MB
arena size: 2228464 # 2.23 MB
RadixUIAdoptionSection.jsx:
file size: 2520 # 2.52 kB
@@ -40,7 +40,7 @@ pdf.mjs:
sys peak growth: 832762 # 832.76 kB
arena allocs: 0
arena reallocs: 0
arena size: 4517312 # 4.52 MB
arena size: 4510576 # 4.51 MB
antd.js:
file size: 6686316 # 6.69 MB
@@ -51,7 +51,7 @@ antd.js:
sys peak growth: 5441278 # 5.44 MB
arena allocs: 0
arena reallocs: 0
arena size: 30154616 # 30.15 MB
arena size: 30069720 # 30.07 MB
binder.ts:
file size: 193077 # 193.08 kB
@@ -62,7 +62,7 @@ binder.ts:
sys peak growth: 246886 # 246.89 kB
arena allocs: 0
arena reallocs: 0
arena size: 917920 # 917.92 kB
arena size: 915968 # 915.97 kB
kitchen-sink.tsx:
file size: 732898 # 732.90 kB
@@ -73,4 +73,4 @@ kitchen-sink.tsx:
sys peak growth: 1101954 # 1.10 MB
arena allocs: 0
arena reallocs: 0
arena size: 6409648 # 6.41 MB
arena size: 6398256 # 6.40 MB
@@ -7,7 +7,7 @@ checker.ts:
sys peak growth: 2243 # 2.24 kB
arena allocs: 1959
arena reallocs: 5
arena size: 13025128 # 13.03 MB
arena size: 12981400 # 12.98 MB
App.tsx:
file size: 415342 # 415.34 kB
@@ -18,7 +18,7 @@ App.tsx:
sys peak growth: 2584 # 2.58 kB
arena allocs: 618
arena reallocs: 17
arena size: 2265096 # 2.27 MB
arena size: 2261752 # 2.26 MB
RadixUIAdoptionSection.jsx:
file size: 2520 # 2.52 kB
@@ -40,7 +40,7 @@ pdf.mjs:
sys peak growth: 1610 # 1.61 kB
arena allocs: 2
arena reallocs: 0
arena size: 4517336 # 4.52 MB
arena size: 4510600 # 4.51 MB
antd.js:
file size: 6686316 # 6.69 MB
@@ -51,7 +51,7 @@ antd.js:
sys peak growth: 1611 # 1.61 kB
arena allocs: 2
arena reallocs: 0
arena size: 30154640 # 30.15 MB
arena size: 30069744 # 30.07 MB
binder.ts:
file size: 193077 # 193.08 kB
@@ -62,7 +62,7 @@ binder.ts:
sys peak growth: 1625 # 1.62 kB
arena allocs: 154
arena reallocs: 0
arena size: 924600 # 924.60 kB
arena size: 922648 # 922.65 kB
kitchen-sink.tsx:
file size: 732898 # 732.90 kB
@@ -73,4 +73,4 @@ kitchen-sink.tsx:
sys peak growth: 3218 # 3.22 kB
arena allocs: 6132
arena reallocs: 280
arena size: 6743744 # 6.74 MB
arena size: 6732352 # 6.73 MB