[LLVMdev] SmallString + raw_svector_ostream combination should be more efficient

Mehdi Amini mehdi.amini at apple.com
Mon Apr 20 09:03:11 PDT 2015


> On Apr 19, 2015, at 7:40 AM, Yaron Keren <yaron.keren at gmail.com> wrote:
> 
> A very common code pattern in LLVM is
> 
>  SmallString<128> S;
>  raw_svector_ostream OS(S);
>  OS<< ...
>  Use OS.str()
> 
> While raw_svector_ostream is smart to share the text buffer itself, it's inefficient keeping two sets of pointers to the same buffer:
> 
>  In SmallString: void *BeginX, *EndX, *CapacityX
>  In raw_ostream: char *OutBufStart, *OutBufEnd, *OutBufCur
> 
> Moreover, at runtime the two sets of pointers need to be coordinated between the SmallString and raw_svector_ostream using raw_svector_ostream::init, raw_svector_ostream::pwrite, raw_svector_ostream::resync and raw_svector_ostream::write_impl.
> All these functions have non-inlined implementations in raw_ostream.cpp. 
> 
> Finally, this may cause subtle bugs if S is modified without calling OS::resync(). This is too easy to do by mistake.

FWIW I’ve been bitten exactly by this last week while updating an out-of-tree compiler to adapt API changes around streams (raw_pwrite_stream). On the positive aspect, I had to learn about the internal of the various streams ;)

The API for raw_svector_ostream is not nice on this aspect, but what is really missing is that there is no assertion to catch it.
I feel it is a bit off from the principle “easy to use, hard to misuse”.


> In this frequent case usage the client does not really care about S being a SmallString with its many useful string helper function. It's just boilerplate code for raw_svector_ostream. But it does cost three extra pointers, some runtime performance and possible bugs.
> 
> To solve all three issues, would it make sense to have raw_ostream-derived container with a its own SmallString like templated-size built-in buffer?

Not sure about the exact solution, but “something” could certainly be done to be more “user-friendly”. 

— 
Mehdi

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150420/a4dd865a/attachment.html>


More information about the llvm-dev mailing list