This PR reduces allocations by changing the check from schema.Symbols.Contains which allocates ReadOnlyCollection on each access to a Symbols property, to a dictionary lookup, which in turn also speeds up Enum writer.
Method
Value
Mean
Error
StdDev
Ratio
Allocated
Alloc Ratio
WriteEnumCurrent
Professional
111.98 ns
1.434 ns
1.342 ns
1.00
48 B
1.00
WriteEnumOptimized
Professional
57.53 ns
1.114 ns
1.042 ns
0.51
24 B
0.50
Benchmark used
[MemoryDiagnoser(displayGenColumns: false)]
[HideColumns("RatioSD")]
public class WriterBenchmarksEnum
{
[Params(Level.Professional)]
public Level Value;
private EnumSchema _schema;
private Encoder.WriteItem _writeItemCurrent;
private Encoder.WriteItem _writeItemOptimized;
private IWriter _writer;
[GlobalSetup]
public void Setup()
{
_schema = (EnumSchema)Schema.Create(Value);
_writeItemCurrent = new WriteResolver().ResolveEnum(_schema);
_writeItemOptimized = new WriteResolver().ResolveEnumOptimized(_schema);
_writer = new Writer(Stream.Null);
}
[Benchmark(Baseline = true)]
public void WriteEnumCurrent() =>
_writeItemCurrent(Value, _writer);
[Benchmark]
public void WriteEnumOptimized() =>
_writeItemOptimized(Value, _writer);
}
public enum Level
{
Expert,
Professional,
SemiProfessional,
Beginner,
Amateur
}
This PR reduces allocations by changing the check from
schema.Symbols.Contains
which allocatesReadOnlyCollection
on each access to aSymbols
property, to a dictionary lookup, which in turn also speeds up Enum writer.Benchmark used