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 |
Last active
December 21, 2020 12:54
-
-
Save sakno/cb012406958bde6e855e422297806def to your computer and use it in GitHub Desktop.
Demonstrates performance measurements of MemoryStream, RecyclableMemoryStream and SparseBuffer
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment