[llvm] r212816 - raw_svector_ostream: grow and reserve atomically
Alp Toker
alp at nuanti.com
Fri Jul 11 09:49:23 PDT 2014
On 11/07/2014 19:41, Alexander Kornienko wrote:
> On Fri, Jul 11, 2014 at 6:35 PM, Alp Toker <alp at nuanti.com
> <mailto:alp at nuanti.com>> wrote:
>
>
> On 11/07/2014 19:26, Alexander Kornienko wrote:
>
> I wonder whether I missed the review thread for this patch or
> this kind of patch is generally accepted to be committed
> without any review?
>
>
> I'm OK with this change, but any review is welcome. This is a
> supporting commit towards fixing the really old FIXMEs related to
> scratch buffer overallocation.
>
>
> Can you explain why changing growth from exponential to linear is fine
> here? For large sizes it will lead to O(size) write time.
There's no change to linear growth. See the implementation of reserve()
which calls into SmallVector's grow():
/// grow - Grow the allocated memory (without initializing new
/// elements), doubling the size of the allocated memory.
/// Guarantees space for at least one more element, or MinSize more
/// elements if specified.
void grow(size_t MinSize = 0);
>
>
>
> On Fri, Jul 11, 2014 at 4:02 PM, Alp Toker <alp at nuanti.com
> <mailto:alp at nuanti.com> <mailto:alp at nuanti.com
> <mailto:alp at nuanti.com>>> wrote:
>
> Author: alp
> Date: Fri Jul 11 09:02:04 2014
> New Revision: 212816
>
> URL: http://llvm.org/viewvc/llvm-project?rev=212816&view=rev
> Log:
> raw_svector_ostream: grow and reserve atomically
>
> Including the scratch buffer size in the initial reservation
> eliminates the
> subsequent malloc+move operation and offers a healthier
> constant
> growth with
> less memory wastage.
>
> When doing this, take care to avoid invalidating the
> source buffer.
>
> Modified:
> llvm/trunk/lib/Support/raw_ostream.cpp
>
> Modified: llvm/trunk/lib/Support/raw_ostream.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/raw_ostream.cpp?rev=212816&r1=212815&r2=212816&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Support/raw_ostream.cpp (original)
> +++ llvm/trunk/lib/Support/raw_ostream.cpp Fri Jul 11
> 09:02:04 2014
> @@ -729,24 +729,26 @@ void raw_svector_ostream::resync() {
> }
>
> void raw_svector_ostream::write_impl(const char *Ptr,
> size_t Size) {
> - // If we're writing bytes from the end of the buffer
> into the
> smallvector, we
> - // don't need to copy the bytes, just commit the bytes
> because
> they are
> - // already in the right place.
> - if (Ptr == OS.end()) {
> - assert(OS.size() + Size <= OS.capacity() && "Invalid
> write_impl() call!");
> - OS.set_size(OS.size() + Size);
> + size_t NewSize = OS.size() + Size;
> + size_t NewReservation = NewSize + 64;
> +
> + bool NoOverlap = Ptr + Size < OS.begin() || Ptr >
> OS.begin() +
> OS.capacity();
> +
> + if (NoOverlap) {
> + assert(!GetNumBytesInBuffer());
> + OS.reserve(NewReservation);
> + memcpy(OS.end(), Ptr, Size);
> + OS.set_size(NewSize);
> + } else if (Ptr == OS.end()) {
> + // Grow the buffer to include the scratch area
> without copying.
> + assert(NewSize <= OS.capacity() && "Invalid
> write_impl() call!");
> + OS.set_size(NewSize);
> + OS.reserve(NewReservation);
> } else {
> - assert(GetNumBytesInBuffer() == 0 &&
> - "Should be writing from buffer if some bytes
> in it");
> - // Otherwise, do copy the bytes.
> - OS.append(Ptr, Ptr+Size);
> + OS.append(Ptr, Ptr + Size);
> + OS.reserve(NewReservation);
> }
>
> - // Grow the vector if necessary.
> - if (OS.capacity() - OS.size() < 64)
> - OS.reserve(OS.capacity() * 2);
> -
> - // Update the buffer position.
> SetBuffer(OS.end(), OS.capacity() - OS.size());
> }
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu <mailto:llvm-commits at cs.uiuc.edu>
> <mailto:llvm-commits at cs.uiuc.edu
> <mailto:llvm-commits at cs.uiuc.edu>>
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
>
> --
> http://www.nuanti.com
> the browser experts
>
>
--
http://www.nuanti.com
the browser experts
More information about the llvm-commits
mailing list