Subject: [boost] [iostreams] null_sink slower than array_sink
From: Daniel Larimer (dlarimer_at_[hidden])
Date: 2011-08-12 15:12:39


I was thinking about using boost::iostreams in place of my own 'array stream', but was surprised by the poor performance.

When doing RPC calls, I often use the following pattern:

a) calculate buffer space required to serialize arguments
b) allocate buffer space
c) serialize into buffer

I use a stream type with an interface of write(),read(), putc(), getc() etc similar to iostreams.

In doing some basic tests serializing a struct I get the following numbers:

stringstream: 2.4e6 times/sec
stream<array_sink>: 3.2e6 times/sec
stream<null_sink>: 1.5e6 times/sec
mystream<char*>: 8.7e6 times/sec (fixed size array)
mystream<size_t>: 1.07e7 times/sec (similar to null_sink, but tracks bytes written)

Perhaps this is the difference between polymorphic and static method calls?

In any case, there is no reason for stream<null_sink> to take twice as long as array_sink as there are no memory copies, all write should be no-ops.
It would probably be useful to add a size_sink that can be used to track the number of bytes written and thus avoid dynamically resizing buffers.