Skip to content

Commit 5fc279c

Browse files
Added compiled switch.
1 parent 8489df0 commit 5fc279c

1 file changed

Lines changed: 123 additions & 2 deletions

File tree

Benchmarks/EnumParseTests.cs

Lines changed: 123 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class EnumParseTests
2222
static readonly string[] ValidValues = new string[] { Greek.Alpha.ToString(), Greek.Epsilon.ToString(), Greek.Phi.ToString() };
2323
static readonly string[] InvalidValues = new string[] { "Apple", "Orange", "Pineapple" };
2424

25-
[Benchmark(Baseline = true)]
25+
//[Benchmark(Baseline = true)]
2626
public Greek EnumParse()
2727
{
2828
Greek e = Greek.None;
@@ -46,7 +46,128 @@ public Greek EnumParse()
4646
return e;
4747
}
4848

49+
private static bool TryParseBySwitch(string value, bool ignoreCase, out Greek e)
50+
{
51+
if(ignoreCase)
52+
{
53+
if (value.Equals(nameof(Greek.Alpha), StringComparison.OrdinalIgnoreCase))
54+
{
55+
e = Greek.Alpha;
56+
return true;
57+
}
58+
59+
if (value.Equals(nameof(Greek.Beta), StringComparison.OrdinalIgnoreCase))
60+
{
61+
e = Greek.Beta;
62+
return true;
63+
}
64+
65+
if (value.Equals(nameof(Greek.Cappa), StringComparison.OrdinalIgnoreCase))
66+
{
67+
e = Greek.Cappa;
68+
return true;
69+
}
70+
71+
if (value.Equals(nameof(Greek.Delta), StringComparison.OrdinalIgnoreCase))
72+
{
73+
e = Greek.Delta;
74+
return true;
75+
}
76+
77+
if (value.Equals(nameof(Greek.Epsilon), StringComparison.OrdinalIgnoreCase))
78+
{
79+
e = Greek.Epsilon;
80+
return true;
81+
}
82+
83+
if (value.Equals(nameof(Greek.Gamma), StringComparison.OrdinalIgnoreCase))
84+
{
85+
e = Greek.Gamma;
86+
return true;
87+
}
88+
89+
if (value.Equals(nameof(Greek.Omega), StringComparison.OrdinalIgnoreCase))
90+
{
91+
e = Greek.Omega;
92+
return true;
93+
}
94+
95+
if (value.Equals(nameof(Greek.Theta), StringComparison.OrdinalIgnoreCase))
96+
{
97+
e = Greek.Theta;
98+
return true;
99+
}
100+
101+
if (value.Equals(nameof(Greek.None), StringComparison.OrdinalIgnoreCase))
102+
{
103+
e = Greek.None;
104+
return true;
105+
}
106+
107+
e = default!;
108+
return false;
109+
}
110+
111+
switch (value)
112+
{
113+
case nameof(Greek.Alpha):
114+
e = Greek.Alpha;
115+
return true;
116+
case nameof(Greek.Beta):
117+
e = Greek.Beta;
118+
return true;
119+
case nameof(Greek.Cappa):
120+
e = Greek.Cappa;
121+
return true;
122+
case nameof(Greek.Delta):
123+
e = Greek.Delta;
124+
return true;
125+
case nameof(Greek.Epsilon):
126+
e = Greek.Epsilon;
127+
return true;
128+
case nameof(Greek.Gamma):
129+
e = Greek.Gamma;
130+
return true;
131+
case nameof(Greek.Omega):
132+
e = Greek.Omega;
133+
return true;
134+
case nameof(Greek.Theta):
135+
e = Greek.Theta;
136+
return true;
137+
case nameof(Greek.None):
138+
e = Greek.None;
139+
return true;
140+
default:
141+
e = default!;
142+
return false;
143+
}
144+
}
145+
49146
[Benchmark]
147+
public Greek Switch()
148+
{
149+
Greek e = Greek.None;
150+
if (UseValid)
151+
{
152+
foreach (string s in ValidValues)
153+
{
154+
if (!TryParseBySwitch(s, IgnoreCase, out e))
155+
throw new Exception("Invalid.");
156+
}
157+
}
158+
else
159+
{
160+
foreach (string s in InvalidValues)
161+
{
162+
if (TryParseBySwitch(s, IgnoreCase, out e))
163+
throw new Exception("Valid.");
164+
}
165+
166+
}
167+
return e;
168+
}
169+
170+
//[Benchmark]
50171
public Greek EnumValueParse()
51172
{
52173
Greek e = Greek.None;
@@ -71,7 +192,7 @@ public Greek EnumValueParse()
71192
}
72193

73194

74-
[Benchmark]
195+
//[Benchmark]
75196
public Greek FastEnumParse()
76197
{
77198
Greek e = Greek.None;

0 commit comments

Comments
 (0)