Closed
Description
Code
I tried this code:
use std::cmp::min;
use std::io;
const TOTAL_BYTES: usize = 16 * 1024 * 1024;
// runtime increases as the difference between these values increases
const BYTES_PER_READ: usize = 8 * 1024;
const BUFREADER_CAPACITY: usize = 256 * 1024;
fn main() {
let mut reader = io::BufReader::with_capacity(BUFREADER_CAPACITY, Reader(TOTAL_BYTES));
let count = io::copy(&mut reader, &mut io::sink()).unwrap();
println!("copied {count} bytes");
}
struct Reader(usize);
impl io::Read for Reader {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
let len = min(min(buf.len(), self.0), BYTES_PER_READ);
if len > 0 {
buf[..len].copy_from_slice(&vec![0; len]);
self.0 -= len;
}
Ok(len)
}
}
I expected to see this happen:
$ rustc -o slowio slowio.rs
$ time ./slowio
copied 16777216 bytes
real 0m0.015s
user 0m0.011s
sys 0m0.003s
Instead, this happened:
$ rustc -o slowio slowio.rs
$ time ./slowio
copied 16777216 bytes
real 0m8.909s
user 0m8.891s
sys 0m0.002s
The problem doesn't occur with optimization enabled.
Version it worked on
It most recently worked on:
rustc 1.63.0 (4b91a6ea7 2022-08-08)
binary: rustc
commit-hash: 4b91a6ea7258a947e59c6522cd5898e7c0a6a88f
commit-date: 2022-08-08
host: x86_64-unknown-linux-gnu
release: 1.63.0
LLVM version: 14.0.5
Version with regression
rustc 1.64.0 (Fedora 1.64.0-1.fc36)
binary: rustc
commit-hash: unknown
commit-date: unknown
host: x86_64-unknown-linux-gnu
release: 1.64.0
LLVM version: 14.0.5
Also fails on:
rustc 1.66.0-nightly (01af5040f 2022-10-04)
binary: rustc
commit-hash: 01af5040fdada6ef8f1b749cda798d80a8590b2c
commit-date: 2022-10-04
host: x86_64-unknown-linux-gnu
release: 1.66.0-nightly
LLVM version: 15.0.2
@rustbot modify labels: +regression-from-stable-to-stable -regression-untriaged