diff --git a/Cargo.toml b/Cargo.toml index 5b8584e..3069720 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,11 @@ test = false bench = false [[bench]] -name = "bench" +name = "engine_bench" +harness = false + +[[bench]] +name = "threadpool_bench" harness = false diff --git a/README.md b/README.md new file mode 100644 index 0000000..4506e7e --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# KV-store + +Based on [Talent Plan, an open source training program initiated by PingCAPcourse](https://github.com/pingcap/talent-plan), +"TP 201: Practical Networked Applications in Rust" diff --git a/benches/bench.rs b/benches/engine_bench.rs similarity index 93% rename from benches/bench.rs rename to benches/engine_bench.rs index 1919192..273c30c 100644 --- a/benches/bench.rs +++ b/benches/engine_bench.rs @@ -13,7 +13,7 @@ fn set_bench(c: &mut Criterion) { let store = KvStore::open(temp_dir.path()).expect("unable to open kvstore"); store }, - |mut store| { + |store| { for i in 1..(1 << 12) { store.set(format!("key{i}"), format!("value{i}")).unwrap(); } @@ -29,7 +29,7 @@ fn set_bench(c: &mut Criterion) { let store = SledKvsEngine::open(temp_dir.path()).expect("unable to open kvstore"); store }, - |mut store| { + |store| { for i in 1..(1 << 12) { store.set(format!("key{i}"), format!("value{i}")).unwrap(); } @@ -45,7 +45,7 @@ fn get_bench(c: &mut Criterion) { for i in &vec![8, 12, 16, 20] { group.bench_with_input(format!("kvs_{i}"), i, |b, i| { let temp_dir = TempDir::new().unwrap(); - let mut store = KvStore::open(temp_dir.path()).unwrap(); + let store = KvStore::open(temp_dir.path()).unwrap(); for key_i in 1..(1 << i) { store .set(format!("key{key_i}"), format!("value{key_i}")) @@ -63,7 +63,7 @@ fn get_bench(c: &mut Criterion) { for i in &vec![8, 12, 16, 20] { group.bench_with_input(format!("sled_{i}"), i, |b, i| { let temp_dir = TempDir::new().unwrap(); - let mut store = SledKvsEngine::open(temp_dir.path()).unwrap(); + let store = SledKvsEngine::open(temp_dir.path()).unwrap(); for key_i in 1..(1 << i) { store .set(format!("key{key_i}"), format!("value{key_i}")) diff --git a/benches/threadpool_bench.rs b/benches/threadpool_bench.rs new file mode 100644 index 0000000..273c30c --- /dev/null +++ b/benches/threadpool_bench.rs @@ -0,0 +1,84 @@ +use criterion::{criterion_group, criterion_main, Criterion}; +use rand::{rngs::SmallRng, Rng, SeedableRng}; +use tempfile::TempDir; +use trash_db::engines::{kvstore::KvStore, sled::SledKvsEngine, KvsEngine}; + +fn set_bench(c: &mut Criterion) { + let mut group = c.benchmark_group("set_bench"); + group.bench_function("kvs", |b| { + b.iter_batched( + || { + let temp_dir = + TempDir::new().expect("unable to create temporary working directory"); + let store = KvStore::open(temp_dir.path()).expect("unable to open kvstore"); + store + }, + |store| { + for i in 1..(1 << 12) { + store.set(format!("key{i}"), format!("value{i}")).unwrap(); + } + }, + criterion::BatchSize::SmallInput, + ) + }); + group.bench_function("sled", |b| { + b.iter_batched( + || { + let temp_dir = + TempDir::new().expect("unable to create temporary working directory"); + let store = SledKvsEngine::open(temp_dir.path()).expect("unable to open kvstore"); + store + }, + |store| { + for i in 1..(1 << 12) { + store.set(format!("key{i}"), format!("value{i}")).unwrap(); + } + }, + criterion::BatchSize::SmallInput, + ) + }); + group.finish(); +} + +fn get_bench(c: &mut Criterion) { + let mut group = c.benchmark_group("set_bench"); + for i in &vec![8, 12, 16, 20] { + group.bench_with_input(format!("kvs_{i}"), i, |b, i| { + let temp_dir = TempDir::new().unwrap(); + let store = KvStore::open(temp_dir.path()).unwrap(); + for key_i in 1..(1 << i) { + store + .set(format!("key{key_i}"), format!("value{key_i}")) + .unwrap(); + } + let mut rng = SmallRng::from_seed([0; 16]); + b.iter(|| { + store + .get(format!("key{}", rng.gen_range(1, 1 << i))) + .unwrap(); + }) + }); + } + + for i in &vec![8, 12, 16, 20] { + group.bench_with_input(format!("sled_{i}"), i, |b, i| { + let temp_dir = TempDir::new().unwrap(); + let store = SledKvsEngine::open(temp_dir.path()).unwrap(); + for key_i in 1..(1 << i) { + store + .set(format!("key{key_i}"), format!("value{key_i}")) + .unwrap(); + } + let mut rng = SmallRng::from_seed([0; 16]); + b.iter(|| { + store + .get(format!("key{}", rng.gen_range(1, 1 << i))) + .unwrap(); + }) + }); + } + group.finish(); +} + +criterion_group!(benches, set_bench, get_bench); +criterion_main!(benches);