]> git.ipfire.org Git - thirdparty/gcc.git/commit
libstdc++: basic_filebuf: don't flush more often than necessary [PR63746]
authorCharles-François Natali <cf.natali@gmail.com>
Thu, 6 Oct 2022 19:02:56 +0000 (20:02 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Tue, 8 Nov 2022 17:35:14 +0000 (17:35 +0000)
commit3f1519eef5cbdcea2f18445852f5482798e3936a
tree7ae06d2f60d23108049a0a1133ed2fcd38097617
parentc93baa93df2d454f329a38686affcfe1a1339766
libstdc++: basic_filebuf: don't flush more often than necessary [PR63746]

`basic_filebuf::xsputn` would bypass the buffer when passed a chunk of
size 1024 and above, seemingly as an optimisation.

This can have a significant performance impact if the overhead of a
`write` syscall is non-negligible, e.g. on a slow disk, on network
filesystems, or simply during IO contention because instead of flushing
every `BUFSIZ` (by default), we can flush every 1024 char.
The impact is even greater with custom larger buffers, e.g. for network
filesystems, because the code could issue `write` for example 1000X more
often than necessary with respect to the buffer size.
It also introduces a significant discontinuity in performance when
writing chunks of size 1024 and above.

Instead, it makes sense to only bypass the buffer if the amount of data
to be written is larger than the buffer capacity.

Signed-off-by: Charles-Francois Natali <cf.natali@gmail.com>
libstdc++-v3/ChangeLog:

PR libstdc++/63746
* include/bits/fstream.tcc (basic_filbuf::xsputn): Remove
1024-byte chunking that bypasses the buffer for large writes.
* testsuite/27_io/basic_filebuf/sputn/char/63746.cc: New test.
libstdc++-v3/include/bits/fstream.tcc
libstdc++-v3/testsuite/27_io/basic_filebuf/sputn/char/63746.cc [new file with mode: 0644]