AdrianStrugala / AvroConvert

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

Reduce allocations of ReadString() method #136

Closed gmanvel closed 8 months ago

gmanvel commented 8 months ago

This PR reduces allocations of ReadString() method by making use of Span based APIs.

Allocations

BenchmarkDotNet also shows allocation/perf improvements.

Method StringLength Ratio Alloc Ratio
Existing 256 1.00 1.00
Optimized 256 0.87 0.69
Existing 512 1.00 1.00
Optimized 512 0.87 0.68
Existing 1024 1.00 1.00
Optimized 1024 0.93 0.67
Existing 2048 1.00 1.00
Optimized 2048 0.85 0.67
Existing 4096 1.00 1.00
Optimized 4096 0.82 0.67

Benchmark used

[MemoryDiagnoser(displayGenColumns: false)]
[HideColumns("Mean", "Median", "Error", "StdDev", "RatioSD", "Allocated")]
public class ReaderBenchmarksString
{
    [Params(256, 512, 1024, 2048, 4096)]
    public int StringLength { get; set; }

    private byte[] _bytes;

    [GlobalSetup]
    public void Setup()
    {
        var ms = new MemoryStream();
        var writer = new Writer(ms);
        writer.WriteString(new string('x', StringLength));

        _bytes = ms.ToArray();
    }

    [Benchmark(Baseline = true)]
    public string Existing()
    {
        var reader = new Reader(new MemoryStream(_bytes));
        return reader.ReadString();
    }

    [Benchmark]
    public string Optimized()
    {
        var reader = new Reader(new MemoryStream(_bytes));
        return reader.ReadStringOptimized();
    }
}