Skip to main content

readahead_bench/
readahead_bench.rs

1use coreshift_core::fs::readahead;
2use std::fs::File;
3use std::io::{Error, ErrorKind, Read};
4use std::os::unix::io::{AsRawFd, RawFd};
5use std::time::Instant;
6
7struct RawFdRef(RawFd);
8
9impl AsRawFd for RawFdRef {
10    fn as_raw_fd(&self) -> RawFd {
11        self.0
12    }
13}
14
15fn main() -> Result<(), Box<dyn std::error::Error>> {
16    let path = std::env::args()
17        .nth(1)
18        .ok_or_else(|| Error::new(ErrorKind::InvalidInput, "usage: readahead_bench <path>"))?;
19
20    let mut file = File::open(&path)?;
21    let len = file.metadata()?.len().min(8 * 1024 * 1024) as usize;
22
23    let start = Instant::now();
24    readahead(RawFdRef(file.as_raw_fd()), 0, len)?;
25    let readahead_elapsed = start.elapsed();
26
27    let mut buf = vec![0u8; len];
28    let start = Instant::now();
29    let read_len = file.read(&mut buf)?;
30    let read_elapsed = start.elapsed();
31
32    println!("readahead({} bytes): {:?}", len, readahead_elapsed);
33    println!("read({} bytes): {:?}", read_len, read_elapsed);
34
35    Ok(())
36}