Skip to content

Instantly share code, notes, and snippets.

@benaadams
Created January 12, 2019 13:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save benaadams/a82c406024b8e74a4b075d3dfce0d220 to your computer and use it in GitHub Desktop.
Save benaadams/a82c406024b8e74a4b075d3dfce0d220 to your computer and use it in GitHub Desktop.
using System;
using System.Buffers;
using System.Runtime.CompilerServices;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
public class Program
{
public static void Main(string[] args)
=> BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args);
private BufferWriter _writer = new BufferWriter();
[Benchmark()]
public void WriterGenericWrapper()
{
var writer = GetWriter(_writer);
writer.Advance(1);
writer.GetMemory();
writer.GetSpan();
}
[Benchmark()]
public void WriterGeneric()
{
var writer = new Writer<BufferWriter>(_writer);
writer.Advance(1);
writer.GetMemory();
writer.GetSpan();
}
[Benchmark()]
public void WriterInterface()
{
var writer = new Writer(_writer);
writer.Advance(1);
writer.GetMemory();
writer.GetSpan();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static Writer<WriterAdapter> GetWriter(BufferWriter pipeWriter)
=> new Writer<WriterAdapter>(new WriterAdapter(pipeWriter));
private struct WriterAdapter : IBufferWriter<byte>
{
public BufferWriter Writer;
public WriterAdapter(BufferWriter writer) => Writer = writer;
public void Advance(int count) => Writer.Advance(count);
public Memory<byte> GetMemory(int sizeHint = 0) => Writer.GetMemory(sizeHint);
public Span<byte> GetSpan(int sizeHint = 0) => Writer.GetSpan(sizeHint);
}
}
public struct Writer<TBufferWriter>
where TBufferWriter : IBufferWriter<byte>
{
private TBufferWriter _writer;
public Writer(TBufferWriter writer) => _writer = writer;
public void Advance(int count) => _writer.Advance(count);
public Memory<byte> GetMemory(int sizeHint = 0) => _writer.GetMemory(sizeHint);
public Span<byte> GetSpan(int sizeHint = 0) => _writer.GetSpan(sizeHint);
}
public struct Writer
{
private IBufferWriter<byte> _writer;
public Writer(IBufferWriter<byte> writer) => _writer = writer;
public void Advance(int count) => _writer.Advance(count);
public Memory<byte> GetMemory(int sizeHint = 0) => _writer.GetMemory(sizeHint);
public Span<byte> GetSpan(int sizeHint = 0) => _writer.GetSpan(sizeHint);
}
public class BufferWriter : IBufferWriter<byte>
{
public void Advance(int count) { }
public Memory<byte> GetMemory(int sizeHint = 0) => default;
public Span<byte> GetSpan(int sizeHint = 0) => default;
}
@benaadams
Copy link
Author

// * Summary *

BenchmarkDotNet=v0.11.3, OS=Windows 10.0.18309
Intel Core i7-4720HQ CPU 2.60GHz (Haswell), 1 CPU, 8 logical and 4 physical cores
.NET Core SDK=3.0.100-preview-009820
  [Host]     : .NET Core 3.0.0-preview-27205-02 (CoreCLR 4.6.27204.02, CoreFX 4.7.18.60501), 64bit RyuJIT
  DefaultJob : .NET Core 3.0.0-preview-27205-02 (CoreCLR 4.6.27204.02, CoreFX 4.7.18.60501), 64bit RyuJIT


               Method |     Mean |     Error |    StdDev |
--------------------- |---------:|----------:|----------:|
 WriterGenericWrapper | 10.85 ns | 0.0098 ns | 0.0091 ns |
        WriterGeneric | 19.72 ns | 0.0492 ns | 0.0384 ns |
      WriterInterface | 19.73 ns | 0.0311 ns | 0.0260 ns |

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment