Skip to content

Commit

Permalink
benchmark: add file reading benchmarks (#3013)
Browse files Browse the repository at this point in the history
  • Loading branch information
stsydow committed May 5, 2021
1 parent 7ac341b commit 177522c
Show file tree
Hide file tree
Showing 2 changed files with 112 additions and 1 deletion.
10 changes: 9 additions & 1 deletion benches/Cargo.toml
Expand Up @@ -5,9 +5,12 @@ publish = false
edition = "2018"

[dependencies]
tokio = { version = "1.0.0", path = "../tokio", features = ["full"] }
tokio = { version = "1.5.0", path = "../tokio", features = ["full"] }
bencher = "0.1.5"

[dev-dependencies]
tokio-util = { version = "0.6.6", path = "../tokio-util", features = ["full"] }

[target.'cfg(unix)'.dependencies]
libc = "0.2.42"

Expand Down Expand Up @@ -41,3 +44,8 @@ harness = false
name = "signal"
path = "signal.rs"
harness = false

[[bench]]
name = "fs"
path = "fs.rs"
harness = false
103 changes: 103 additions & 0 deletions benches/fs.rs
@@ -0,0 +1,103 @@
#![cfg(unix)]

use tokio::stream::StreamExt;

use tokio::fs::File;
use tokio::io::AsyncReadExt;
use tokio_util::codec::{BytesCodec, FramedRead /*FramedWrite*/};

use bencher::{benchmark_group, benchmark_main, Bencher};

use std::fs::File as StdFile;
use std::io::Read as StdRead;

fn rt() -> tokio::runtime::Runtime {
tokio::runtime::Builder::new_multi_thread()
.worker_threads(2)
.build()
.unwrap()
}

const BLOCK_COUNT: usize = 1_000;

const BUFFER_SIZE: usize = 4096;
const DEV_ZERO: &'static str = "/dev/zero";

fn async_read_codec(b: &mut Bencher) {
let rt = rt();

b.iter(|| {
let task = || async {
let file = File::open(DEV_ZERO).await.unwrap();
let mut input_stream = FramedRead::with_capacity(file, BytesCodec::new(), BUFFER_SIZE);

for _i in 0..BLOCK_COUNT {
let _bytes = input_stream.next().await.unwrap();
}
};

rt.block_on(task());
});
}

fn async_read_buf(b: &mut Bencher) {
let rt = rt();

b.iter(|| {
let task = || async {
let mut file = File::open(DEV_ZERO).await.unwrap();
let mut buffer = [0u8; BUFFER_SIZE];

for _i in 0..BLOCK_COUNT {
let count = file.read(&mut buffer).await.unwrap();
if count == 0 {
break;
}
}
};

rt.block_on(task());
});
}

fn async_read_std_file(b: &mut Bencher) {
let rt = rt();

let task = || async {
let mut file = tokio::task::block_in_place(|| Box::pin(StdFile::open(DEV_ZERO).unwrap()));

for _i in 0..BLOCK_COUNT {
let mut buffer = [0u8; BUFFER_SIZE];
let mut file_ref = file.as_mut();

tokio::task::block_in_place(move || {
file_ref.read_exact(&mut buffer).unwrap();
});
}
};

b.iter(|| {
rt.block_on(task());
});
}

fn sync_read(b: &mut Bencher) {
b.iter(|| {
let mut file = StdFile::open(DEV_ZERO).unwrap();
let mut buffer = [0u8; BUFFER_SIZE];

for _i in 0..BLOCK_COUNT {
file.read_exact(&mut buffer).unwrap();
}
});
}

benchmark_group!(
file,
async_read_std_file,
async_read_buf,
async_read_codec,
sync_read
);

benchmark_main!(file);

0 comments on commit 177522c

Please sign in to comment.