Boost logo

Boost Users :

Subject: [Boost-users] [iostreams]Can I write data directly to the device of a stream?
From: Comet (cometliao_at_[hidden])
Date: 2010-05-20 03:31:26


Hi,
I assumed that stream wrote data directly to it's associated device,
but after a few tests I found I was wrong.
I wrote this code snippet:

<--- Code --->
int main() {
  using namespace std;
  using namespace boost::iostreams;

  string src;
  src.assign(10 * 1024, 'a');
  size_t size = src.size();

  // ContainerDevice is from boost::iostreams::example
  typedef ContainerDevice<std::vector<char> > MyDevice;

  vector<char> container;
  string str;
  container.reserve(size);
  str.reserve(size);

  for (size_t i = 0; i < 1000000; ++i) {
    // Version 1
    MyDevice device(container);
    stream<MyDevice> io(device);
    io.write(src.c_str(), src.size());
    io.flush();
    container.clear();

    // Version 2
#if 0
    str.insert(str.end(), src.begin(), src.end());
    container.insert(container.end(), str.begin(), str.end());
    str.clear();
    container.clear();
#endif
  }

  return 0;
}

<--- Code-End --->

The first version(write data to the device by stream) is slower than the
second(copy data, then copy again to device), so I guess stream do some
unnecessary copy operations (eg: copy data to inner buffer, then copy
again from buffer to device).
I tried replacing
stream<MyDevice> io(device);
with
stream<MyDevice> io(device, 0, 0);
to set inner buffer size to 0, but the result was much more slower. I
set a breakpoint at
ContainerDevice::write(const char_type* data, std::streamsize n)
then found n passed was always 1, which means every call wrote only 1
byte.
If there is a way to write data directly to the device, my program will
be very efficient.
thanks.


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net