Skip to content

Commit e081bf4

Browse files
authored
Merge pull request #301 from servicetitan/upstream/InternShortStrings
Intern short (1..2 chars) contents of TextNode; Statically preallocate Comma TextNode as mostly used
2 parents dedbcaf + c0cf132 commit e081bf4

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/ContainerNode.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ internal override void AcceptVisitor(NodeVisitor visitor)
164164
internal void FlushBuffer()
165165
{
166166
if (stringBuilder.Length > 0) {
167-
children.Add(new TextNode(stringBuilder.ToString()));
167+
children.Add(TextNode.Create(stringBuilder.ToString()));
168168
lastNodeIsText = true;
169169
lastChar = stringBuilder[^1];
170170
_ = stringBuilder.Clear();

Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/TextNode.cs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,30 @@ namespace Xtensive.Sql.Compiler
99
[DebuggerDisplay("Text = {Text}")]
1010
internal class TextNode : Node
1111
{
12+
private const string CommaString = ", ";
13+
private static readonly TextNode CommaNode = new TextNode(CommaString);
14+
1215
public readonly string Text;
1316

14-
internal override void AcceptVisitor(NodeVisitor visitor)
17+
public static TextNode Create(string text)
1518
{
16-
visitor.Visit(this);
19+
if (text.Length < 3) {
20+
text = string.Intern(text);
21+
if (text == CommaString) {
22+
return CommaNode;
23+
}
24+
}
25+
return new TextNode(text);
1726
}
1827

28+
internal override void AcceptVisitor(NodeVisitor visitor) => visitor.Visit(this);
29+
1930
// Constructor
2031

21-
public TextNode(string text)
32+
private TextNode(string text)
2233
: base(true)
2334
{
2435
Text = text;
2536
}
2637
}
27-
}
38+
}

0 commit comments

Comments
 (0)