AdrianStrugala / AvroConvert

Rapid Avro serializer for C# .NET
Other
97 stars 27 forks source link

Reduce allocations & speed up enum writer #131

Closed gmanvel closed 8 months ago

gmanvel commented 8 months ago

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
}