Make basic_streambuf::xsputn write characters in chunks whenever possible, instead of one at a time. References PR#10193

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@229866 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/streambuf b/include/streambuf
index 6adfc92..603c680 100644
--- a/include/streambuf
+++ b/include/streambuf
@@ -536,12 +536,23 @@
 {
     streamsize __i = 0;
     int_type __eof = traits_type::eof();
-    for (; __i < __n; ++__s, ++__i)
+    while( __i < __n)
     {
-        if (__nout_ < __eout_)
-            *__nout_++ = *__s;
-        else if (overflow(traits_type::to_int_type(*__s)) == __eof)
-            break;
+        if (__nout_ >= __eout_)
+        {
+            if (overflow(traits_type::to_int_type(*__s)) == __eof)
+                break;
+            ++__s;
+            ++__i;
+        }
+        else
+        {
+            streamsize __chunk_size = _VSTD::min(__eout_ - __nout_, __n - __i);
+            traits_type::copy(__nout_, __s, __chunk_size);
+            __nout_ += __chunk_size;
+            __s     += __chunk_size;
+            __i     += __chunk_size;
+        }
     }
     return __i;
 }