...
This commit is contained in:
95
ourdb/Cargo.lock
generated
95
ourdb/Cargo.lock
generated
@@ -29,6 +29,12 @@ version = "1.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "2.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd"
|
||||
|
||||
[[package]]
|
||||
name = "bumpalo"
|
||||
version = "3.17.0"
|
||||
@@ -181,6 +187,22 @@ version = "1.15.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
|
||||
|
||||
[[package]]
|
||||
name = "errno"
|
||||
version = "0.3.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fastrand"
|
||||
version = "2.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
|
||||
|
||||
[[package]]
|
||||
name = "getrandom"
|
||||
version = "0.2.15"
|
||||
@@ -189,7 +211,19 @@ checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"wasi",
|
||||
"wasi 0.11.0+wasi-snapshot-preview1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "getrandom"
|
||||
version = "0.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"r-efi",
|
||||
"wasi 0.14.2+wasi-0.2.4",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -250,6 +284,12 @@ version = "0.2.171"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6"
|
||||
|
||||
[[package]]
|
||||
name = "linux-raw-sys"
|
||||
version = "0.9.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12"
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.27"
|
||||
@@ -291,6 +331,7 @@ dependencies = [
|
||||
"criterion",
|
||||
"log",
|
||||
"rand",
|
||||
"tempfile",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
@@ -349,6 +390,12 @@ dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "r-efi"
|
||||
version = "5.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5"
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.8.5"
|
||||
@@ -376,7 +423,7 @@ version = "0.6.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
|
||||
dependencies = [
|
||||
"getrandom",
|
||||
"getrandom 0.2.15",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -428,6 +475,19 @@ version = "0.8.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
|
||||
|
||||
[[package]]
|
||||
name = "rustix"
|
||||
version = "1.0.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"errno",
|
||||
"libc",
|
||||
"linux-raw-sys",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustversion"
|
||||
version = "1.0.20"
|
||||
@@ -492,6 +552,19 @@ dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tempfile"
|
||||
version = "3.19.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf"
|
||||
dependencies = [
|
||||
"fastrand",
|
||||
"getrandom 0.3.2",
|
||||
"once_cell",
|
||||
"rustix",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror"
|
||||
version = "1.0.69"
|
||||
@@ -544,6 +617,15 @@ version = "0.11.0+wasi-snapshot-preview1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
|
||||
|
||||
[[package]]
|
||||
name = "wasi"
|
||||
version = "0.14.2+wasi-0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3"
|
||||
dependencies = [
|
||||
"wit-bindgen-rt",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen"
|
||||
version = "0.2.100"
|
||||
@@ -694,6 +776,15 @@ version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-rt"
|
||||
version = "0.39.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.8.24"
|
||||
|
@@ -13,6 +13,7 @@ rand = "0.8.5"
|
||||
|
||||
[dev-dependencies]
|
||||
criterion = "0.5.1"
|
||||
tempfile = "3.8.0"
|
||||
|
||||
[[bench]]
|
||||
name = "ourdb_benchmarks"
|
||||
|
@@ -26,7 +26,7 @@ use std::path::PathBuf;
|
||||
fn main() -> Result<(), ourdb::Error> {
|
||||
// Create a new database
|
||||
let config = OurDBConfig {
|
||||
path: PathBuf::from("/path/to/db"),
|
||||
path: PathBuf::from("/tmp/ourdb"),
|
||||
incremental_mode: true,
|
||||
file_size: None, // Use default (500MB)
|
||||
keysize: None, // Use default (4 bytes)
|
||||
|
277
ourdb/benches/ourdb_benchmarks.rs
Normal file
277
ourdb/benches/ourdb_benchmarks.rs
Normal file
@@ -0,0 +1,277 @@
|
||||
use criterion::{black_box, criterion_group, criterion_main, Criterion};
|
||||
use ourdb::{OurDB, OurDBConfig, OurDBSetArgs};
|
||||
use std::path::PathBuf;
|
||||
use tempfile::tempdir;
|
||||
|
||||
fn criterion_benchmark(c: &mut Criterion) {
|
||||
// Create a temporary directory for benchmarks
|
||||
let temp_dir = tempdir().expect("Failed to create temp directory");
|
||||
let db_path = temp_dir.path().to_path_buf();
|
||||
|
||||
// Benchmark set operation (insertion)
|
||||
c.bench_function("set", |b| {
|
||||
let config = OurDBConfig {
|
||||
path: db_path.clone(),
|
||||
incremental_mode: true,
|
||||
file_size: Some(10 * 1024 * 1024), // 10MB
|
||||
keysize: None,
|
||||
};
|
||||
|
||||
let mut db = OurDB::new(config).unwrap();
|
||||
let test_data = vec![b'X'; 100]; // 100 bytes of data
|
||||
let mut i = 0;
|
||||
|
||||
b.iter(|| {
|
||||
let args = OurDBSetArgs {
|
||||
id: None, // Let the DB assign an ID
|
||||
data: &test_data,
|
||||
};
|
||||
black_box(db.set(args).unwrap());
|
||||
i += 1;
|
||||
});
|
||||
});
|
||||
|
||||
// Setup database with data for other benchmarks
|
||||
let setup_config = OurDBConfig {
|
||||
path: db_path.clone(),
|
||||
incremental_mode: true,
|
||||
file_size: Some(10 * 1024 * 1024), // 10MB
|
||||
keysize: None,
|
||||
};
|
||||
|
||||
let mut setup_db = OurDB::new(setup_config).unwrap();
|
||||
let test_data = vec![b'X'; 100]; // 100 bytes of data
|
||||
let mut ids = Vec::with_capacity(1000);
|
||||
|
||||
// Insert 1000 records
|
||||
for _ in 0..1000 {
|
||||
let args = OurDBSetArgs {
|
||||
id: None,
|
||||
data: &test_data,
|
||||
};
|
||||
let id = setup_db.set(args).unwrap();
|
||||
ids.push(id);
|
||||
}
|
||||
|
||||
// Benchmark get operation
|
||||
c.bench_function("get", |b| {
|
||||
let config = OurDBConfig {
|
||||
path: db_path.clone(),
|
||||
incremental_mode: true,
|
||||
file_size: Some(10 * 1024 * 1024),
|
||||
keysize: None,
|
||||
};
|
||||
|
||||
let mut db = OurDB::new(config).unwrap();
|
||||
let mut i = 0;
|
||||
|
||||
b.iter(|| {
|
||||
let id = ids[i % ids.len()];
|
||||
black_box(db.get(id).unwrap());
|
||||
i += 1;
|
||||
});
|
||||
});
|
||||
|
||||
// Benchmark update operation
|
||||
c.bench_function("update", |b| {
|
||||
let config = OurDBConfig {
|
||||
path: db_path.clone(),
|
||||
incremental_mode: true,
|
||||
file_size: Some(10 * 1024 * 1024),
|
||||
keysize: None,
|
||||
};
|
||||
|
||||
let mut db = OurDB::new(config).unwrap();
|
||||
let updated_data = vec![b'Y'; 100]; // Different data for updates
|
||||
let mut i = 0;
|
||||
|
||||
b.iter(|| {
|
||||
let id = ids[i % ids.len()];
|
||||
let args = OurDBSetArgs {
|
||||
id: Some(id),
|
||||
data: &updated_data,
|
||||
};
|
||||
black_box(db.set(args).unwrap());
|
||||
i += 1;
|
||||
});
|
||||
});
|
||||
|
||||
// Benchmark get_history operation
|
||||
c.bench_function("get_history", |b| {
|
||||
let config = OurDBConfig {
|
||||
path: db_path.clone(),
|
||||
incremental_mode: true,
|
||||
file_size: Some(10 * 1024 * 1024),
|
||||
keysize: None,
|
||||
};
|
||||
|
||||
let mut db = OurDB::new(config).unwrap();
|
||||
let mut i = 0;
|
||||
|
||||
b.iter(|| {
|
||||
let id = ids[i % ids.len()];
|
||||
black_box(db.get_history(id, 2).unwrap());
|
||||
i += 1;
|
||||
});
|
||||
});
|
||||
|
||||
// Benchmark delete operation
|
||||
c.bench_function("delete", |b| {
|
||||
// Create a fresh database for deletion benchmarks
|
||||
let delete_dir = tempdir().expect("Failed to create temp directory");
|
||||
let delete_path = delete_dir.path().to_path_buf();
|
||||
|
||||
let config = OurDBConfig {
|
||||
path: delete_path.clone(),
|
||||
incremental_mode: true,
|
||||
file_size: Some(10 * 1024 * 1024),
|
||||
keysize: None,
|
||||
};
|
||||
|
||||
let mut db = OurDB::new(config).unwrap();
|
||||
let test_data = vec![b'X'; 100];
|
||||
|
||||
// Setup keys to delete
|
||||
let mut delete_ids = Vec::with_capacity(1000);
|
||||
for _ in 0..1000 {
|
||||
let args = OurDBSetArgs {
|
||||
id: None,
|
||||
data: &test_data,
|
||||
};
|
||||
let id = db.set(args).unwrap();
|
||||
delete_ids.push(id);
|
||||
}
|
||||
|
||||
let mut i = 0;
|
||||
b.iter(|| {
|
||||
let id = delete_ids[i % delete_ids.len()];
|
||||
// Only try to delete if it exists (not already deleted)
|
||||
if db.get(id).is_ok() {
|
||||
black_box(db.delete(id).unwrap());
|
||||
}
|
||||
i += 1;
|
||||
});
|
||||
});
|
||||
|
||||
// Benchmark key-value mode vs incremental mode
|
||||
let mut group = c.benchmark_group("mode_comparison");
|
||||
|
||||
// Benchmark set in key-value mode
|
||||
group.bench_function("set_keyvalue_mode", |b| {
|
||||
let kv_dir = tempdir().expect("Failed to create temp directory");
|
||||
let kv_path = kv_dir.path().to_path_buf();
|
||||
|
||||
let config = OurDBConfig {
|
||||
path: kv_path.clone(),
|
||||
incremental_mode: false, // Key-value mode
|
||||
file_size: Some(10 * 1024 * 1024),
|
||||
keysize: None,
|
||||
};
|
||||
|
||||
let mut db = OurDB::new(config).unwrap();
|
||||
let test_data = vec![b'X'; 100];
|
||||
let mut i = 0;
|
||||
|
||||
b.iter(|| {
|
||||
let id = i + 1; // Explicit ID
|
||||
let args = OurDBSetArgs {
|
||||
id: Some(id as u32),
|
||||
data: &test_data,
|
||||
};
|
||||
black_box(db.set(args).unwrap());
|
||||
i += 1;
|
||||
});
|
||||
});
|
||||
|
||||
// Benchmark set in incremental mode
|
||||
group.bench_function("set_incremental_mode", |b| {
|
||||
let inc_dir = tempdir().expect("Failed to create temp directory");
|
||||
let inc_path = inc_dir.path().to_path_buf();
|
||||
|
||||
let config = OurDBConfig {
|
||||
path: inc_path.clone(),
|
||||
incremental_mode: true, // Incremental mode
|
||||
file_size: Some(10 * 1024 * 1024),
|
||||
keysize: None,
|
||||
};
|
||||
|
||||
let mut db = OurDB::new(config).unwrap();
|
||||
let test_data = vec![b'X'; 100];
|
||||
|
||||
b.iter(|| {
|
||||
let args = OurDBSetArgs {
|
||||
id: None, // Auto-generated ID
|
||||
data: &test_data,
|
||||
};
|
||||
black_box(db.set(args).unwrap());
|
||||
});
|
||||
});
|
||||
|
||||
group.finish();
|
||||
|
||||
// Benchmark with different record sizes
|
||||
let mut size_group = c.benchmark_group("record_size");
|
||||
|
||||
for &size in &[10, 100, 1000, 10000] {
|
||||
size_group.bench_function(format!("set_size_{}", size), |b| {
|
||||
let size_dir = tempdir().expect("Failed to create temp directory");
|
||||
let size_path = size_dir.path().to_path_buf();
|
||||
|
||||
let config = OurDBConfig {
|
||||
path: size_path.clone(),
|
||||
incremental_mode: true,
|
||||
file_size: Some(10 * 1024 * 1024),
|
||||
keysize: None,
|
||||
};
|
||||
|
||||
let mut db = OurDB::new(config).unwrap();
|
||||
let test_data = vec![b'X'; size];
|
||||
|
||||
b.iter(|| {
|
||||
let args = OurDBSetArgs {
|
||||
id: None,
|
||||
data: &test_data,
|
||||
};
|
||||
black_box(db.set(args).unwrap());
|
||||
});
|
||||
});
|
||||
|
||||
size_group.bench_function(format!("get_size_{}", size), |b| {
|
||||
let size_dir = tempdir().expect("Failed to create temp directory");
|
||||
let size_path = size_dir.path().to_path_buf();
|
||||
|
||||
let config = OurDBConfig {
|
||||
path: size_path.clone(),
|
||||
incremental_mode: true,
|
||||
file_size: Some(10 * 1024 * 1024),
|
||||
keysize: None,
|
||||
};
|
||||
|
||||
let mut db = OurDB::new(config).unwrap();
|
||||
let test_data = vec![b'X'; size];
|
||||
|
||||
// Insert some records first
|
||||
let mut size_ids = Vec::with_capacity(100);
|
||||
for _ in 0..100 {
|
||||
let args = OurDBSetArgs {
|
||||
id: None,
|
||||
data: &test_data,
|
||||
};
|
||||
let id = db.set(args).unwrap();
|
||||
size_ids.push(id);
|
||||
}
|
||||
|
||||
let mut i = 0;
|
||||
b.iter(|| {
|
||||
let id = size_ids[i % size_ids.len()];
|
||||
black_box(db.get(id).unwrap());
|
||||
i += 1;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
size_group.finish();
|
||||
}
|
||||
|
||||
criterion_group!(benches, criterion_benchmark);
|
||||
criterion_main!(benches);
|
Reference in New Issue
Block a user