Roland that's not the fastest way with some other reagards, because stringstream as all iostream classes are designed to deal with thread safe apps and call lock/unlock pairs for _every_ character inserted. This operation is done by constructing the ostream::sentry guard. To be more efficient write your output to stream_buf classes.

try adapting this example to your needs:
http://codepad.org/ujfeLB72

When I did some tests, this brought me performance factor of 3 or 4 over common iostream.

With Kind Regards,
Ovanes


On Fri, Feb 27, 2009 at 6:46 PM, Roland Bock <rbock@eudoxos.de> wrote:
Hi,

I have a program which produces a vector of integers (several million entries). I need to write that into a human-readable string of space separated numbers.

I wonder, what would be the fastest way?

My first attempt was

stringstream resultStream;
copy(integers.begin(), integers.end(), ostream_iterator<int>(resultStream, " "));
string result = resultStream.str();


But that requires copying the string.


Thus I was wondering if I could use boost to write to the target string directly?

boost::iostreams allow me to do the following:


string result;
boost::iostreams::filtering_ostream out(boost::iostreams::back_inserter(result));
copy(integers.begin(), integers.end(), ostream_iterator<uint64>(out, " "));

This is faster by almost a factor of 2.

Any ideas how to increase speed even more?


Thanks in advance,

Roland
_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users