-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTemplateBenchmarks.cs
More file actions
106 lines (92 loc) · 2.72 KB
/
TemplateBenchmarks.cs
File metadata and controls
106 lines (92 loc) · 2.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
using BenchmarkDotNet.Attributes;
using FastExpressionCompiler;
using Hyperbee.Templating.Configure;
using Hyperbee.Templating.Provider.XS.Compiler;
using Hyperbee.Templating.Text;
using Hyperbee.XS.Core;
namespace Hyperbee.Templating.Benchmark;
public class TemplateBenchmarks
{
private static readonly TypeResolver TypeResolver = new XsTokenExpressionProvider.MemberTypeResolver( ReferenceManager.Create() );
[Benchmark( Baseline = true )]
public void ParserSingleLine()
{
const string template = "hello. this is a single line template with no tokens.";
Template.Render( template, default );
}
[Benchmark]
public void ParserMultiLine()
{
const string template =
"""
hello.
this is a multi line template with no tokens.
and no trailing cr lf pair on the last line
""";
Template.Render( template, default );
}
[Benchmark]
public void NestedTokens()
{
const string template = "hello {{name}}.";
Template.Render( template, new()
{
Variables =
{
["name"] = "{{first}} {{last_expression}}",
["first"] = "hari",
["last"] = "seldon",
["last_expression"] = "{{last}}"
}
} );
}
[Benchmark]
public void InlineBlockExpression()
{
const string expression = "{{name}}";
const string definition =
"""
{{name:{{x => {
return x.choice switch
{
"1" => "me",
"2" => "you",
_ => "default"
};
} }} }}
""";
const string template = $"{definition}hello {expression}.";
Template.Render( template, new()
{
Variables =
{
["choice"] = "2"
}
} );
}
[Benchmark]
public void InlineBlockExpressionXs()
{
const string expression = "{{name}}";
const string definition =
"""
{{name:{{x => {
switch( x.choice )
{
case "1": "me";
case "2": "you";
default: "default";
};
} }} }}
""";
const string template = $"{definition}hello {expression}.";
Template.Render( template, new TemplateOptions
{
Variables = { ["choice"] = "2" },
TokenExpressionProvider = new XsTokenExpressionProvider(
compile: lambda => lambda.CompileFast(),
typeResolver: TypeResolver
)
} );
}
}