Boost logo

Boost Users :

Subject: Re: [Boost-users] Fastest way of serializing a huge vector of ints into a human readable string
From: Roland Bock (rbock_at_[hidden])
Date: 2009-03-01 09:36:34


Ovanes,

I wonder, though, is there a standard way to write integers to a
stream_buf? As far as I can see, the ostreambuf_iterator takes character
classes as template arguments, only.

Regards,

Roland

Roland Bock wrote:
> Ovanes,
>
> thanks for the explanation and the link.
>
> I must admit that I avoided taking closer looks at stream_buf classes,
> but I will change that now :-)
>
> Regards,
>
> Roland
>
> Ovanes Markarian wrote:
>> 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_at_[hidden]
>> <mailto:rbock_at_[hidden]>> 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_at_[hidden] <mailto:Boost-users_at_[hidden]>
>> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>>
>>
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> Boost-users mailing list
>> Boost-users_at_[hidden]
>> http://lists.boost.org/mailman/listinfo.cgi/boost-users
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users


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