From e90756d8a095264f6d6ae6b3a660e73c587162cd Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Fri, 4 Mar 2011 18:18:16 +0000 Subject: [PATCH] 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 --- lib/Support/raw_ostream.cpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/Support/raw_ostream.cpp b/lib/Support/raw_ostream.cpp index 80ea7407b44..b8839e2943b 100644 --- a/lib/Support/raw_ostream.cpp +++ b/lib/Support/raw_ostream.cpp @@ -265,15 +265,19 @@ raw_ostream &raw_ostream::write(const char *Ptr, size_t Size) { return write(Ptr, Size); } - // Write out the data in buffer-sized blocks until the remainder - // fits within the buffer. - do { - size_t NumBytes = OutBufEnd - OutBufCur; - copy_to_buffer(Ptr, NumBytes); - flush_nonempty(); - Ptr += NumBytes; - Size -= NumBytes; - } while (OutBufCur+Size > OutBufEnd); + // If the buffer is empty at this point we have a string that is larger + // than the buffer. It's better to write it unbuffered in this case. + if (BUILTIN_EXPECT(OutBufCur == OutBufStart, false)) { + write_impl(Ptr, Size); + return *this; + } + + // We don't have enough space in the buffer to fit the string in. Insert as + // 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); -- 2.11.0