BufferedStream
With a buffer, we avoid executing writes and reads until a certain number of operations has been requested. Then we execute them all at once.
Buffering makes things faster—many bytes can be written at once, reducing overhead of each byte
. The BufferedStream
in C# can be used to optimize stream reads and writes.
Consider this program. It uses a MemoryStream
and we want to write 5 million bytes to it. But we wrap the MemoryStream
in a BufferedStream
.
WriteByte
on the BufferedStream
, which acts upon the MemoryStream
. But it buffers operations.WriteByte
calls is printed as the program exits.using System; using System.Diagnostics; using System.IO; class Program { static void Main() { var t1 = Stopwatch.StartNew(); // Use BufferedStream to buffer writes to a MemoryStream. using (MemoryStream memory = new MemoryStream()) using (BufferedStream stream = new BufferedStream(memory)) { // Write a byte 5 million times. for (int i = 0; i < 5000000; i++) { stream.WriteByte(5); } } t1.Stop(); Console.WriteLine("BUFFEREDSTREAM TIME: " + t1.Elapsed.TotalMilliseconds); } }BUFFEREDSTREAM TIME: 20.6607
We must compare our BufferedStream
benchmark to another one without BufferedStream
. Here we use MemoryStream
directly—no buffering is done.
WriteByte
calls in this program take an entire 5 milliseconds more than in the version that uses BufferedStream
.using System; using System.Diagnostics; using System.IO; class Program { static void Main() { var t1 = Stopwatch.StartNew(); // Use MemoryStream directly with no buffering. using (MemoryStream memory = new MemoryStream()) { // Write a byte 5 million times. for (int i = 0; i < 5000000; i++) { memory.WriteByte(5); } } t1.Stop(); Console.WriteLine("MEMORYSTREAM TIME: " + t1.Elapsed.TotalMilliseconds); } }MEMORYSTREAM TIME: 26.2119
By using BufferedStream
, we achieved a performance boost. This would not be helpful on small streams or fewer writes.
To achieve "optimal" performance, we need to always measure. But BufferedStream
is a good option to try to improve stream read and write performance.
Most programs will not benefit from BufferedStream
. But it is good to know it exists. It can improve both reads and writes.