raw_ostream: If writing a string that is larger than the buffer, write it directly instead of doing many buffer-sized writes.

This caps the number of write(2) calls per string to a maximum of 2.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127010 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Benjamin Kramer 2011-03-04 18:18:16 +00:00
parent beb9a1f9fd
commit e90756d8a0

View File

@ -265,15 +265,19 @@ raw_ostream &raw_ostream::write(const char *Ptr, size_t Size) {
return write(Ptr, Size); return write(Ptr, Size);
} }
// Write out the data in buffer-sized blocks until the remainder // If the buffer is empty at this point we have a string that is larger
// fits within the buffer. // than the buffer. It's better to write it unbuffered in this case.
do { if (BUILTIN_EXPECT(OutBufCur == OutBufStart, false)) {
size_t NumBytes = OutBufEnd - OutBufCur; write_impl(Ptr, Size);
copy_to_buffer(Ptr, NumBytes); return *this;
flush_nonempty(); }
Ptr += NumBytes;
Size -= NumBytes; // We don't have enough space in the buffer to fit the string in. Insert as
} while (OutBufCur+Size > OutBufEnd); // much as possible, flush and start over with the remainder.
size_t NumBytes = OutBufEnd - OutBufCur;
copy_to_buffer(Ptr, NumBytes);
flush_nonempty();
return write(Ptr + NumBytes, Size - NumBytes);
} }
copy_to_buffer(Ptr, Size); copy_to_buffer(Ptr, Size);