Skip to content

Instantly share code, notes, and snippets.

@MichalBrylka
Last active February 9, 2022 10:53
Show Gist options
  • Select an option

  • Save MichalBrylka/8cd90a06e6f901a361ce6538e45ee1d7 to your computer and use it in GitHub Desktop.

Select an option

Save MichalBrylka/8cd90a06e6f901a361ce6538e45ee1d7 to your computer and use it in GitHub Desktop.
Generated enum parser performance
[MemoryDiagnoser]
public class EnumParserBenchNonFlagGenerated
{
public enum DayOfWeek : byte
{
None ,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday,
}
public static string[] AllEnums =
Enumerable.Range(0, 50).Select(i => ((DayOfWeek)i).ToString("G").Replace(" ", "")).ToArray();
private static readonly ITransformer<DayOfWeek> _parser = TextTransformer.Default.GetTransformer<DayOfWeek>();
[Benchmark(Baseline = true)]
public DayOfWeek EnumTransformer()
{
DayOfWeek current = default;
for (int i = AllEnums.Length - 1; i >= 0; i--)
{
var text = AllEnums[i];
current = _parser.Parse(text.AsSpan());
}
return current;
}
[Benchmark]
public DayOfWeek Generated()
{
DayOfWeek current = default;
for (int i = AllEnums.Length - 1; i >= 0; i--)
{
var text = AllEnums[i];
current = ParseIgnoreCase(text);
}
return current;
}
private static DayOfWeek ParseIgnoreCase(string text) =>
text switch
{
{ } s when s.Equals(nameof(DayOfWeek.None), StringComparison.OrdinalIgnoreCase) => DayOfWeek.None,
{ } s when s.Equals(nameof(DayOfWeek.Monday), StringComparison.OrdinalIgnoreCase) => DayOfWeek.Monday,
{ } s when s.Equals(nameof(DayOfWeek.Tuesday), StringComparison.OrdinalIgnoreCase) => DayOfWeek.Tuesday,
{ } s when s.Equals(nameof(DayOfWeek.Wednesday), StringComparison.OrdinalIgnoreCase) => DayOfWeek.Wednesday,
{ } s when s.Equals(nameof(DayOfWeek.Thursday), StringComparison.OrdinalIgnoreCase) => DayOfWeek.Thursday,
{ } s when s.Equals(nameof(DayOfWeek.Friday), StringComparison.OrdinalIgnoreCase) => DayOfWeek.Friday,
{ } s when s.Equals(nameof(DayOfWeek.Saturday), StringComparison.OrdinalIgnoreCase) => DayOfWeek.Saturday,
{ } s when s.Equals(nameof(DayOfWeek.Sunday), StringComparison.OrdinalIgnoreCase) => DayOfWeek.Sunday,
_ => Enum.Parse<DayOfWeek>(text, true)
};
}

.NET Core 3.1.22 (CoreCLR 4.700.21.56803, CoreFX 4.700.21.57101), X64 RyuJIT

Method Mean Error StdDev Ratio RatioSD Gen 0 Gen 1 Gen 2 Allocated
EnumTransformer 2.859 us 0.0462 us 0.0409 us 1.00 0.00 - - - -
Generated 3.161 us 0.0523 us 0.0489 us 1.11 0.02 - - - -

.NET Core 6.0.1 (CoreCLR 6.0.121.56705, CoreFX 6.0.121.56705), X64 RyuJIT

Method Mean Error StdDev Ratio Gen 0 Gen 1 Gen 2 Allocated
EnumTransformer 2.648 us 0.0419 us 0.0392 us 1.00 - - - -
Generated 2.226 us 0.0144 us 0.0128 us 0.84 - - - -
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment