Skip to content

Instantly share code, notes, and snippets.

@sakno
Last active December 21, 2020 12:54
Show Gist options
  • Save sakno/cb012406958bde6e855e422297806def to your computer and use it in GitHub Desktop.
Save sakno/cb012406958bde6e855e422297806def to your computer and use it in GitHub Desktop.
Demonstrates performance measurements of MemoryStream, RecyclableMemoryStream and SparseBuffer
using System;
using System.IO;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Engines;
using BenchmarkDotNet.Order;
using Microsoft.IO;
namespace DotNext.Buffers
{
using IO;
[SimpleJob(runStrategy: RunStrategy.Throughput, launchCount: 1)]
[Orderer(SummaryOrderPolicy.FastestToSlowest)]
[MemoryDiagnoser]
public class MemoryStreamingBenchmark
{
private static readonly RecyclableMemoryStreamManager manager = new RecyclableMemoryStreamManager();
private readonly byte[] chunk = new byte[2048];
[Params(100, 1000, 10_000, 100_000, 1000_000)]
public int TotalCount;
private void Write(Stream output)
{
for (int remaining = TotalCount, taken; remaining > 0; remaining -= taken)
{
taken = Math.Min(remaining, chunk.Length);
output.Write(chunk, 0, taken);
}
}
[Benchmark(Baseline = true)]
public void WriteToMemoryStream()
{
using var ms = new MemoryStream();
Write(ms);
}
[Benchmark]
public void WriteToRecyclableMemoryStream()
{
using var ms = manager.GetStream();
Write(ms);
}
[Benchmark]
public void WriteToSparseBuffer()
{
using var buffer = new SparseBufferWriter<byte>();
using var ms = buffer.AsStream(false);
Write(ms);
}
[Benchmark]
public void WriteToGrowableBuffer()
{
using var buffer = new PooledArrayBufferWriter<byte>();
using var ms = buffer.AsStream();
Write(ms);
}
[Benchmark]
public void WriteToBufferingWriter()
{
using var writer = new FileBufferingWriter(asyncIO: false);
Write(writer);
}
}
}
Method TotalCount Mean Error StdDev Median Ratio RatioSD Gen 0 Gen 1 Gen 2 Allocated
WriteToMemoryStream 100 66.84 ns 1.379 ns 3.383 ns 64.88 ns 1.00 0.00 0.1097 - - 344 B
WriteToGrowableBuffer 100 224.09 ns 0.695 ns 0.616 ns 224.12 ns 3.13 0.10 0.0408 - - 128 B
WriteToSparseBuffer 100 856.98 ns 3.948 ns 3.083 ns 856.20 ns 11.90 0.33 0.0916 - - 288 B
WriteToBufferingWriter 100 1,745.02 ns 34.863 ns 32.611 ns 1,763.21 ns 24.46 0.84 0.0324 - - 104 B
WriteToRecyclableMemoryStream 100 2,435.67 ns 12.147 ns 11.363 ns 2,434.00 ns 34.14 1.13 0.1030 - - 328 B
WriteToMemoryStream 1000 125.26 ns 0.925 ns 0.722 ns 125.41 ns 1.00 0.00 0.3467 - - 1088 B
WriteToGrowableBuffer 1000 484.94 ns 1.713 ns 1.602 ns 484.18 ns 3.87 0.03 0.0401 - - 128 B
WriteToSparseBuffer 1000 902.65 ns 17.244 ns 18.451 ns 908.97 ns 7.16 0.15 0.0916 - - 288 B
WriteToBufferingWriter 1000 1,790.85 ns 33.684 ns 36.042 ns 1,800.59 ns 14.36 0.32 0.0324 - - 104 B
WriteToRecyclableMemoryStream 1000 2,602.84 ns 52.018 ns 144.141 ns 2,509.28 ns 21.17 1.32 0.1030 - - 328 B
WriteToGrowableBuffer 10000 1,668.36 ns 24.951 ns 20.835 ns 1,662.83 ns 0.67 0.01 0.0401 - - 128 B
WriteToSparseBuffer 10000 1,861.27 ns 35.824 ns 49.037 ns 1,835.50 ns 0.76 0.02 0.1450 - - 464 B
WriteToMemoryStream 10000 2,469.75 ns 22.697 ns 21.231 ns 2,463.43 ns 1.00 0.00 9.8343 - - 30880 B
WriteToBufferingWriter 10000 2,893.18 ns 55.774 ns 74.457 ns 2,848.58 ns 1.18 0.04 0.0305 - - 104 B
WriteToRecyclableMemoryStream 10000 3,037.52 ns 8.712 ns 8.149 ns 3,039.39 ns 1.23 0.01 0.1030 - - 328 B
WriteToRecyclableMemoryStream 100000 7,786.51 ns 22.854 ns 20.259 ns 7,787.28 ns 0.12 0.00 0.0916 - - 328 B
WriteToGrowableBuffer 100000 8,761.04 ns 19.962 ns 18.672 ns 8,761.68 ns 0.13 0.00 0.0305 - - 128 B
WriteToSparseBuffer 100000 13,293.46 ns 25.761 ns 22.836 ns 13,292.46 ns 0.20 0.00 0.7629 - - 2400 B
WriteToMemoryStream 100000 66,688.17 ns 309.777 ns 274.609 ns 66,713.49 ns 1.00 0.00 41.6260 41.6260 41.6260 260340 B
WriteToBufferingWriter 100000 106,081.05 ns 2,074.638 ns 2,130.501 ns 106,347.41 ns 1.59 0.03 - - - 368 B
WriteToRecyclableMemoryStream 1000000 54,646.80 ns 240.708 ns 201.002 ns 54,577.19 ns 0.06 0.00 0.1831 - - 736 B
WriteToGrowableBuffer 1000000 81,335.82 ns 602.052 ns 563.160 ns 81,342.86 ns 0.09 0.00 - - - 128 B
WriteToSparseBuffer 1000000 272,838.96 ns 5,399.202 ns 12,831.774 ns 270,873.19 ns 0.30 0.01 160.1563 53.2227 0.9766 763360 B
WriteToBufferingWriter 1000000 715,022.16 ns 8,531.408 ns 7,124.112 ns 715,995.51 ns 0.80 0.01 - - - 368 B
WriteToMemoryStream 1000000 892,200.17 ns 3,499.065 ns 3,101.830 ns 892,516.27 ns 1.00 0.00 499.0234 499.0234 499.0234 2095552 B
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment