readahead_bench/
readahead_bench.rs1use 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}