$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
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.