diff options
| author | bors <bors@rust-lang.org> | 2023-06-17 10:30:59 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2023-06-17 10:30:59 +0000 |
| commit | 7513407ac8e673f536d34743fe393bd8b7c45441 (patch) | |
| tree | 7842b67e97253168dd480cf520bada088569467f /compiler/rustc_codegen_llvm/src | |
| parent | f90d57d06ebc7f250b60b9cab583f111d9a5fb9d (diff) | |
| parent | 373878573569371be876bb838607c64076f17f49 (diff) | |
| download | rust-7513407ac8e673f536d34743fe393bd8b7c45441.tar.gz rust-7513407ac8e673f536d34743fe393bd8b7c45441.zip | |
Auto merge of #112330 - the8472:use-buf-reader-buffer, r=thomcc
Extend io::copy buffer reuse to BufReader too
previously it was only able to use BufWriter. This was due to a limitation in the BufReader generics that prevented specialization. This change works around the issue by using `BufReader where Self: Read` instead of `BufReader<I> where I: Read`. This limits our options, e.g. we can't access the inner reader, but it happens to work out if we rely on some implementation details.
Copying 1MiB from `/dev/zero` to `/dev/null` through a 256KiB BufReader yields following improvements
```
OLD:
io::copy::tests::bench_copy_buf_reader 51.44µs/iter +/- 703.00ns
NEW:
io::copy::tests::bench_copy_buf_reader 18.55µs/iter +/- 237.00ns
```
Previously this would read 256KiB into the reader but then copy 8KiB chunks to the writer through an additional intermediate buffer inside `io::copy`. Since those devices don't do much work most of the speedup should come from fewer syscalls and avoided memcopies.
The b3sum crate [notes that the default buffer size in io::copy is too small](https://github.com/BLAKE3-team/BLAKE3/blob/4108923f5284e0f8c3cf97b59041c2b6b2f601d3/b3sum/src/main.rs#L235-L239). With this optimization they could achieve the desired performance by wrapping the reader in a `BufReader` instead of handrolling it.
Currently the optimization doesn't apply to things like `StdinLock`, but this can be addressed with an additional `AsMutBufReader` specialization trait.
Diffstat (limited to 'compiler/rustc_codegen_llvm/src')
0 files changed, 0 insertions, 0 deletions
