Skip to content

Commit 73f04ee

Browse files
authored
Add mechanism where IR token generation can defer allocation of it's … (#22792)
* Add mechanism where IR token generation can defer allocation of it's content. It turns out that many IR tokens access their content, and thus allocating it is unnecessary. In particular, with this change against a large file, I've seen allocations under SyntaxNodeExtensions.GetContent reduced by about 33%. Performance wise, I've seen the number of CPU samples in the profile under GetContent reduce by about 40% (in my sample I typed 26 characters and there was about 600 ms less spent in GetContent) * ContentGetter => ContentFactory * Make tests happy with the switch from IntermediateToken to IntermediateTokenWithDeferreedContentAllocation * IntermediateTokenWithDeferredContentAllocation => LazyIntermediateToken
1 parent 3e6495f commit 73f04ee

File tree

581 files changed

+7576
-7553
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

581 files changed

+7576
-7553
lines changed

src/Razor/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X/test/ModelExpressionPassTest.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public void ModelExpressionPass_NonModelExpressionProperty_Ignored()
4848
var tagHelper = FindTagHelperNode(irDocument);
4949
var setProperty = tagHelper.Children.OfType<TagHelperPropertyIntermediateNode>().Single();
5050

51-
var token = Assert.IsType<IntermediateToken>(Assert.Single(setProperty.Children));
51+
var token = Assert.IsAssignableFrom<IntermediateToken>(Assert.Single(setProperty.Children));
5252
Assert.True(token.IsCSharp);
5353
Assert.Equal("17", token.Content);
5454
}
@@ -92,7 +92,7 @@ public void ModelExpressionPass_ModelExpressionProperty_SimpleExpression()
9292
var expression = Assert.IsType<CSharpExpressionIntermediateNode>(Assert.Single(setProperty.Children));
9393
Assert.Equal("ModelExpressionProvider.CreateModelExpression(ViewData, __model => __model.Bar)", GetCSharpContent(expression));
9494

95-
var originalNode = Assert.IsType<IntermediateToken>(expression.Children[2]);
95+
var originalNode = Assert.IsAssignableFrom<IntermediateToken>(expression.Children[2]);
9696
Assert.Equal(TokenKind.CSharp, originalNode.Kind);
9797
Assert.Equal("Bar", originalNode.Content);
9898
Assert.Equal(new SourceSpan("test.cshtml", 51, 1, 8, 3), originalNode.Source.Value);
@@ -137,7 +137,7 @@ public void ModelExpressionPass_ModelExpressionProperty_ComplexExpression()
137137
var expression = Assert.IsType<CSharpExpressionIntermediateNode>(Assert.Single(setProperty.Children));
138138
Assert.Equal("ModelExpressionProvider.CreateModelExpression(ViewData, __model => Bar)", GetCSharpContent(expression));
139139

140-
var originalNode = Assert.IsType<IntermediateToken>(expression.Children[1]);
140+
var originalNode = Assert.IsAssignableFrom<IntermediateToken>(expression.Children[1]);
141141
Assert.Equal(TokenKind.CSharp, originalNode.Kind);
142142
Assert.Equal("Bar", originalNode.Content);
143143
Assert.Equal(new SourceSpan("test.cshtml", 52, 1, 9, 3), originalNode.Source.Value);

src/Razor/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Basic_DesignTime.ir.txt

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,33 +29,33 @@ Document -
2929
IntermediateToken - - CSharp - #pragma warning restore 0414
3030
MethodDeclaration - - public async override - global::System.Threading.Tasks.Task - ExecuteAsync
3131
HtmlContent - (0:0,0 [4] Basic.cshtml)
32-
IntermediateToken - (0:0,0 [4] Basic.cshtml) - Html - <div
32+
LazyIntermediateToken - (0:0,0 [4] Basic.cshtml) - Html - <div
3333
HtmlAttribute - (4:0,4 [25] Basic.cshtml) - class=" - "
3434
CSharpExpressionAttributeValue - (12:0,12 [16] Basic.cshtml) -
35-
IntermediateToken - (13:0,13 [15] Basic.cshtml) - CSharp - this.ToString()
35+
LazyIntermediateToken - (13:0,13 [15] Basic.cshtml) - CSharp - this.ToString()
3636
HtmlContent - (29:0,29 [24] Basic.cshtml)
37-
IntermediateToken - (29:0,29 [1] Basic.cshtml) - Html - >
38-
IntermediateToken - (30:0,30 [23] Basic.cshtml) - Html - \n Hello world\n
37+
LazyIntermediateToken - (29:0,29 [1] Basic.cshtml) - Html - >
38+
LazyIntermediateToken - (30:0,30 [23] Basic.cshtml) - Html - \n Hello world\n
3939
CSharpExpression - (54:2,5 [29] Basic.cshtml)
40-
IntermediateToken - (54:2,5 [29] Basic.cshtml) - CSharp - string.Format("{0}", "Hello")
40+
LazyIntermediateToken - (54:2,5 [29] Basic.cshtml) - CSharp - string.Format("{0}", "Hello")
4141
HtmlContent - (83:2,34 [10] Basic.cshtml)
42-
IntermediateToken - (83:2,34 [2] Basic.cshtml) - Html - \n
43-
IntermediateToken - (85:3,0 [6] Basic.cshtml) - Html - </div>
44-
IntermediateToken - (91:3,6 [2] Basic.cshtml) - Html - \n
42+
LazyIntermediateToken - (83:2,34 [2] Basic.cshtml) - Html - \n
43+
LazyIntermediateToken - (85:3,0 [6] Basic.cshtml) - Html - </div>
44+
LazyIntermediateToken - (91:3,6 [2] Basic.cshtml) - Html - \n
4545
CSharpCode - (95:4,2 [25] Basic.cshtml)
46-
IntermediateToken - (95:4,2 [25] Basic.cshtml) - CSharp - \n var cls = "foo";\n
46+
LazyIntermediateToken - (95:4,2 [25] Basic.cshtml) - CSharp - \n var cls = "foo";\n
4747
HtmlContent - (123:7,0 [2] Basic.cshtml)
48-
IntermediateToken - (123:7,0 [2] Basic.cshtml) - Html - <p
48+
LazyIntermediateToken - (123:7,0 [2] Basic.cshtml) - Html - <p
4949
HtmlAttribute - (125:7,2 [34] Basic.cshtml) - class=" - "
5050
CSharpCodeAttributeValue - (133:7,10 [25] Basic.cshtml) -
51-
IntermediateToken - (134:7,11 [18] Basic.cshtml) - CSharp - if(cls != null) {
51+
LazyIntermediateToken - (134:7,11 [18] Basic.cshtml) - CSharp - if(cls != null) {
5252
CSharpExpression - (153:7,30 [3] Basic.cshtml)
53-
IntermediateToken - (153:7,30 [3] Basic.cshtml) - CSharp - cls
54-
IntermediateToken - (156:7,33 [2] Basic.cshtml) - CSharp - }
53+
LazyIntermediateToken - (153:7,30 [3] Basic.cshtml) - CSharp - cls
54+
LazyIntermediateToken - (156:7,33 [2] Basic.cshtml) - CSharp - }
5555
HtmlContent - (159:7,36 [5] Basic.cshtml)
56-
IntermediateToken - (159:7,36 [1] Basic.cshtml) - Html -
57-
IntermediateToken - (160:7,37 [2] Basic.cshtml) - Html - />
58-
IntermediateToken - (162:7,39 [2] Basic.cshtml) - Html - \n
56+
LazyIntermediateToken - (159:7,36 [1] Basic.cshtml) - Html -
57+
LazyIntermediateToken - (160:7,37 [2] Basic.cshtml) - Html - />
58+
LazyIntermediateToken - (162:7,39 [2] Basic.cshtml) - Html - \n
5959
Inject -
6060
Inject -
6161
Inject -

src/Razor/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/IncompleteDirectives_DesignTime.ir.txt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,25 +32,25 @@ Document -
3232
IntermediateToken - - CSharp - #pragma warning restore 0414
3333
MethodDeclaration - - public async override - global::System.Threading.Tasks.Task - ExecuteAsync
3434
HtmlContent - (85:1,0 [2] IncompleteDirectives.cshtml)
35-
IntermediateToken - (85:1,0 [2] IncompleteDirectives.cshtml) - Html - \n
35+
LazyIntermediateToken - (85:1,0 [2] IncompleteDirectives.cshtml) - Html - \n
3636
MalformedDirective - (87:2,0 [6] IncompleteDirectives.cshtml) - model
3737
HtmlContent - (93:2,6 [2] IncompleteDirectives.cshtml)
38-
IntermediateToken - (93:2,6 [2] IncompleteDirectives.cshtml) - Html - \n
38+
LazyIntermediateToken - (93:2,6 [2] IncompleteDirectives.cshtml) - Html - \n
3939
MalformedDirective - (95:3,0 [7] IncompleteDirectives.cshtml) - model
4040
DirectiveToken - (102:3,7 [0] IncompleteDirectives.cshtml) -
4141
HtmlContent - (102:3,7 [4] IncompleteDirectives.cshtml)
42-
IntermediateToken - (102:3,7 [4] IncompleteDirectives.cshtml) - Html - \n\n
42+
LazyIntermediateToken - (102:3,7 [4] IncompleteDirectives.cshtml) - Html - \n\n
4343
MalformedDirective - (106:5,0 [7] IncompleteDirectives.cshtml) - inject
4444
HtmlContent - (113:5,7 [2] IncompleteDirectives.cshtml)
45-
IntermediateToken - (113:5,7 [2] IncompleteDirectives.cshtml) - Html - \n
45+
LazyIntermediateToken - (113:5,7 [2] IncompleteDirectives.cshtml) - Html - \n
4646
MalformedDirective - (115:6,0 [8] IncompleteDirectives.cshtml) - inject
4747
DirectiveToken - (123:6,8 [0] IncompleteDirectives.cshtml) -
4848
HtmlContent - (123:6,8 [2] IncompleteDirectives.cshtml)
49-
IntermediateToken - (123:6,8 [2] IncompleteDirectives.cshtml) - Html - \n
49+
LazyIntermediateToken - (123:6,8 [2] IncompleteDirectives.cshtml) - Html - \n
5050
MalformedDirective - (125:7,0 [25] IncompleteDirectives.cshtml) - inject
5151
DirectiveToken - (133:7,8 [17] IncompleteDirectives.cshtml) - MyService<TModel>
5252
HtmlContent - (150:7,25 [2] IncompleteDirectives.cshtml)
53-
IntermediateToken - (150:7,25 [2] IncompleteDirectives.cshtml) - Html - \n
53+
LazyIntermediateToken - (150:7,25 [2] IncompleteDirectives.cshtml) - Html - \n
5454
Inject -
5555
Inject -
5656
Inject -

src/Razor/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/InvalidNamespaceAtEOF_DesignTime.ir.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ Document -
2929
IntermediateToken - - CSharp - #pragma warning restore 0414
3030
MethodDeclaration - - public async override - global::System.Threading.Tasks.Task - ExecuteAsync
3131
HtmlContent - (10:0,10 [6] InvalidNamespaceAtEOF.cshtml)
32-
IntermediateToken - (10:0,10 [6] InvalidNamespaceAtEOF.cshtml) - Html - Test.
32+
LazyIntermediateToken - (10:0,10 [6] InvalidNamespaceAtEOF.cshtml) - Html - Test.
3333
Inject -
3434
Inject -
3535
Inject -

src/Razor/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/ModelExpressionTagHelper_DesignTime.ir.txt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,32 +33,32 @@ Document -
3333
IntermediateToken - - CSharp - #pragma warning restore 0414
3434
MethodDeclaration - - public async override - global::System.Threading.Tasks.Task - ExecuteAsync
3535
HtmlContent - (17:1,0 [2] ModelExpressionTagHelper.cshtml)
36-
IntermediateToken - (17:1,0 [2] ModelExpressionTagHelper.cshtml) - Html - \n
36+
LazyIntermediateToken - (17:1,0 [2] ModelExpressionTagHelper.cshtml) - Html - \n
3737
HtmlContent - (62:2,43 [4] ModelExpressionTagHelper.cshtml)
38-
IntermediateToken - (62:2,43 [4] ModelExpressionTagHelper.cshtml) - Html - \n\n
38+
LazyIntermediateToken - (62:2,43 [4] ModelExpressionTagHelper.cshtml) - Html - \n\n
3939
TagHelper - (66:4,0 [25] ModelExpressionTagHelper.cshtml) - input-test - TagMode.SelfClosing
4040
DefaultTagHelperBody -
4141
DefaultTagHelperCreate - - InputTestTagHelper
4242
DefaultTagHelperProperty - (83:4,17 [4] ModelExpressionTagHelper.cshtml) - for - Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression InputTestTagHelper.For - HtmlAttributeValueStyle.DoubleQuotes
4343
CSharpExpression -
4444
IntermediateToken - - CSharp - ModelExpressionProvider.CreateModelExpression(ViewData, __model =>
4545
IntermediateToken - - CSharp - __model.
46-
IntermediateToken - (83:4,17 [4] ModelExpressionTagHelper.cshtml) - CSharp - Date
46+
LazyIntermediateToken - (83:4,17 [4] ModelExpressionTagHelper.cshtml) - CSharp - Date
4747
IntermediateToken - - CSharp - )
4848
DefaultTagHelperExecute -
4949
HtmlContent - (91:4,25 [2] ModelExpressionTagHelper.cshtml)
50-
IntermediateToken - (91:4,25 [2] ModelExpressionTagHelper.cshtml) - Html - \n
50+
LazyIntermediateToken - (91:4,25 [2] ModelExpressionTagHelper.cshtml) - Html - \n
5151
TagHelper - (93:5,0 [27] ModelExpressionTagHelper.cshtml) - input-test - TagMode.SelfClosing
5252
DefaultTagHelperBody -
5353
DefaultTagHelperCreate - - InputTestTagHelper
5454
DefaultTagHelperProperty - (110:5,17 [6] ModelExpressionTagHelper.cshtml) - for - Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression InputTestTagHelper.For - HtmlAttributeValueStyle.DoubleQuotes
5555
CSharpExpression -
5656
IntermediateToken - - CSharp - ModelExpressionProvider.CreateModelExpression(ViewData, __model =>
57-
IntermediateToken - (111:5,18 [5] ModelExpressionTagHelper.cshtml) - CSharp - Model
57+
LazyIntermediateToken - (111:5,18 [5] ModelExpressionTagHelper.cshtml) - CSharp - Model
5858
IntermediateToken - - CSharp - )
5959
DefaultTagHelperExecute -
6060
HtmlContent - (120:5,27 [2] ModelExpressionTagHelper.cshtml)
61-
IntermediateToken - (120:5,27 [2] ModelExpressionTagHelper.cshtml) - Html - \n
61+
LazyIntermediateToken - (120:5,27 [2] ModelExpressionTagHelper.cshtml) - Html - \n
6262
Inject -
6363
Inject -
6464
Inject -

src/Razor/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Sections_DesignTime.ir.txt

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -34,38 +34,38 @@ Document -
3434
IntermediateToken - - CSharp - #pragma warning restore 0414
3535
MethodDeclaration - - public async override - global::System.Threading.Tasks.Task - ExecuteAsync
3636
HtmlContent - (17:1,0 [2] Sections.cshtml)
37-
IntermediateToken - (17:1,0 [2] Sections.cshtml) - Html - \n
37+
LazyIntermediateToken - (17:1,0 [2] Sections.cshtml) - Html - \n
3838
HtmlContent - (62:2,43 [4] Sections.cshtml)
39-
IntermediateToken - (62:2,43 [4] Sections.cshtml) - Html - \n\n
39+
LazyIntermediateToken - (62:2,43 [4] Sections.cshtml) - Html - \n\n
4040
CSharpCode - (68:4,2 [46] Sections.cshtml)
41-
IntermediateToken - (68:4,2 [46] Sections.cshtml) - CSharp - \n Layout = "_SectionTestLayout.cshtml";\n
41+
LazyIntermediateToken - (68:4,2 [46] Sections.cshtml) - CSharp - \n Layout = "_SectionTestLayout.cshtml";\n
4242
HtmlContent - (117:7,0 [26] Sections.cshtml)
43-
IntermediateToken - (117:7,0 [2] Sections.cshtml) - Html - \n
44-
IntermediateToken - (119:8,0 [4] Sections.cshtml) - Html - <div
45-
IntermediateToken - (123:8,4 [1] Sections.cshtml) - Html - >
46-
IntermediateToken - (124:8,5 [9] Sections.cshtml) - Html - Some body
47-
IntermediateToken - (133:8,14 [6] Sections.cshtml) - Html - </div>
48-
IntermediateToken - (139:8,20 [4] Sections.cshtml) - Html - \n\n
43+
LazyIntermediateToken - (117:7,0 [2] Sections.cshtml) - Html - \n
44+
LazyIntermediateToken - (119:8,0 [4] Sections.cshtml) - Html - <div
45+
LazyIntermediateToken - (123:8,4 [1] Sections.cshtml) - Html - >
46+
LazyIntermediateToken - (124:8,5 [9] Sections.cshtml) - Html - Some body
47+
LazyIntermediateToken - (133:8,14 [6] Sections.cshtml) - Html - </div>
48+
LazyIntermediateToken - (139:8,20 [4] Sections.cshtml) - Html - \n\n
4949
Section - - Section1
5050
HtmlContent - (162:10,19 [43] Sections.cshtml)
51-
IntermediateToken - (162:10,19 [6] Sections.cshtml) - Html - \n
52-
IntermediateToken - (168:11,4 [4] Sections.cshtml) - Html - <div
53-
IntermediateToken - (172:11,8 [1] Sections.cshtml) - Html - >
54-
IntermediateToken - (173:11,9 [20] Sections.cshtml) - Html - This is in Section 1
55-
IntermediateToken - (193:11,29 [6] Sections.cshtml) - Html - </div>
56-
IntermediateToken - (199:11,35 [6] Sections.cshtml) - Html - \n
51+
LazyIntermediateToken - (162:10,19 [6] Sections.cshtml) - Html - \n
52+
LazyIntermediateToken - (168:11,4 [4] Sections.cshtml) - Html - <div
53+
LazyIntermediateToken - (172:11,8 [1] Sections.cshtml) - Html - >
54+
LazyIntermediateToken - (173:11,9 [20] Sections.cshtml) - Html - This is in Section 1
55+
LazyIntermediateToken - (193:11,29 [6] Sections.cshtml) - Html - </div>
56+
LazyIntermediateToken - (199:11,35 [6] Sections.cshtml) - Html - \n
5757
TagHelper - (205:12,4 [25] Sections.cshtml) - input-test - TagMode.SelfClosing
5858
DefaultTagHelperBody -
5959
DefaultTagHelperCreate - - InputTestTagHelper
6060
DefaultTagHelperProperty - (222:12,21 [4] Sections.cshtml) - for - Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression InputTestTagHelper.For - HtmlAttributeValueStyle.DoubleQuotes
6161
CSharpExpression -
6262
IntermediateToken - - CSharp - ModelExpressionProvider.CreateModelExpression(ViewData, __model =>
6363
IntermediateToken - - CSharp - __model.
64-
IntermediateToken - (222:12,21 [4] Sections.cshtml) - CSharp - Date
64+
LazyIntermediateToken - (222:12,21 [4] Sections.cshtml) - CSharp - Date
6565
IntermediateToken - - CSharp - )
6666
DefaultTagHelperExecute -
6767
HtmlContent - (230:12,29 [2] Sections.cshtml)
68-
IntermediateToken - (230:12,29 [2] Sections.cshtml) - Html - \n
68+
LazyIntermediateToken - (230:12,29 [2] Sections.cshtml) - Html - \n
6969
Inject -
7070
Inject -
7171
Inject -

src/Razor/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/ViewComponentTagHelper_DesignTime.ir.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,21 +33,21 @@ Document -
3333
IntermediateToken - - CSharp - #pragma warning restore 0414
3434
MethodDeclaration - - public async override - global::System.Threading.Tasks.Task - ExecuteAsync
3535
HtmlContent - (26:0,26 [2] ViewComponentTagHelper.cshtml)
36-
IntermediateToken - (26:0,26 [2] ViewComponentTagHelper.cshtml) - Html - \n
36+
LazyIntermediateToken - (26:0,26 [2] ViewComponentTagHelper.cshtml) - Html - \n
3737
CSharpCode - (30:1,2 [26] ViewComponentTagHelper.cshtml)
38-
IntermediateToken - (30:1,2 [26] ViewComponentTagHelper.cshtml) - CSharp - \n var foo = "Hello";\n
38+
LazyIntermediateToken - (30:1,2 [26] ViewComponentTagHelper.cshtml) - CSharp - \n var foo = "Hello";\n
3939
HtmlContent - (59:4,0 [2] ViewComponentTagHelper.cshtml)
40-
IntermediateToken - (59:4,0 [2] ViewComponentTagHelper.cshtml) - Html - \n
40+
LazyIntermediateToken - (59:4,0 [2] ViewComponentTagHelper.cshtml) - Html - \n
4141
TagHelper - (61:5,0 [50] ViewComponentTagHelper.cshtml) - vc:test - TagMode.StartTagAndEndTag
4242
DefaultTagHelperBody -
4343
DefaultTagHelperCreate - - AllTagHelper
4444
DefaultTagHelperCreate - - AspNetCore.TestFiles_IntegrationTests_CodeGenerationIntegrationTest_ViewComponentTagHelper.__Generated__TestViewComponentTagHelper
4545
DefaultTagHelperProperty - (82:5,21 [4] ViewComponentTagHelper.cshtml) - first-name - string TestViewComponentTagHelper.firstName - HtmlAttributeValueStyle.DoubleQuotes
4646
CSharpExpression - (83:5,22 [3] ViewComponentTagHelper.cshtml)
47-
IntermediateToken - (83:5,22 [3] ViewComponentTagHelper.cshtml) - CSharp - foo
47+
LazyIntermediateToken - (83:5,22 [3] ViewComponentTagHelper.cshtml) - CSharp - foo
4848
DefaultTagHelperProperty - (93:5,32 [6] ViewComponentTagHelper.cshtml) - bar - string AllTagHelper.Bar - HtmlAttributeValueStyle.DoubleQuotes
4949
HtmlContent - (93:5,32 [6] ViewComponentTagHelper.cshtml)
50-
IntermediateToken - (93:5,32 [6] ViewComponentTagHelper.cshtml) - Html - World
50+
LazyIntermediateToken - (93:5,32 [6] ViewComponentTagHelper.cshtml) - Html - World
5151
DefaultTagHelperExecute -
5252
Inject -
5353
Inject -

0 commit comments

Comments
 (0)