diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2011-03-04 18:18:16 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2011-03-04 18:18:16 +0000 |
commit | e90756d8a095264f6d6ae6b3a660e73c587162cd (patch) | |
tree | 44179711dabf20c1dbc1b8e0d4cb485184bd325f /lib/Support/raw_ostream.cpp | |
parent | beb9a1f9fd1b660809929bf136eb2d897638d4c1 (diff) |
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
Diffstat (limited to 'lib/Support/raw_ostream.cpp')
-rw-r--r-- | lib/Support/raw_ostream.cpp | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/lib/Support/raw_ostream.cpp b/lib/Support/raw_ostream.cpp index 80ea7407b4..b8839e2943 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); |