use std::sync::Arc;
use criterion::{criterion_group, criterion_main, Criterion};
use delta_kernel::snapshot::Snapshot;
use delta_kernel::try_parse_uri;
use tempfile::TempDir;
use test_utils::delta_kernel_default_engine::executor::tokio::TokioBackgroundExecutor;
use test_utils::delta_kernel_default_engine::{DefaultEngine, DefaultEngineBuilder};
use test_utils::load_test_data;
use url::Url;
const SCAN_METADATA_BENCH_SAMPLE_SIZE: usize = 20;
fn setup() -> (TempDir, Url, Arc<DefaultEngine<TokioBackgroundExecutor>>) {
let table = "300k-add-files-100-col-partitioned";
let tempdir = load_test_data("./tests/data", table).unwrap();
let table_path = tempdir.path().join(table);
let url = try_parse_uri(table_path.to_str().unwrap()).expect("Failed to parse table path");
use test_utils::delta_kernel_default_engine::storage::store_from_url;
let store = store_from_url(&url).expect("Failed to create store");
let engine = DefaultEngineBuilder::new(store).build();
(tempdir, url, Arc::new(engine))
}
fn create_snapshot_benchmark(c: &mut Criterion) {
let (_tempdir, url, engine) = setup();
c.bench_function("create_snapshot", |b| {
b.iter(|| {
Snapshot::builder_for(url.clone())
.build(engine.as_ref())
.expect("Failed to create snapshot")
})
});
}
fn scan_metadata_benchmark(c: &mut Criterion) {
let (_tempdir, url, engine) = setup();
let snapshot = Snapshot::builder_for(url.clone())
.build(engine.as_ref())
.expect("Failed to create snapshot");
let mut group = c.benchmark_group("scan_metadata");
group.sample_size(SCAN_METADATA_BENCH_SAMPLE_SIZE);
for without_row_transforms in [false, true] {
let id = if without_row_transforms {
"scan_metadata_without_row_transforms"
} else {
"scan_metadata"
};
group.bench_function(id, |b| {
b.iter(|| {
let mut builder = snapshot.clone().scan_builder();
if without_row_transforms {
builder = builder.without_row_transforms();
}
let scan = builder.build().expect("Failed to build scan");
let metadata_iter = scan
.scan_metadata(engine.as_ref())
.expect("Failed to get scan metadata");
for result in metadata_iter {
result.expect("Failed to process scan metadata");
}
})
});
}
group.finish();
}
criterion_group!(benches, create_snapshot_benchmark, scan_metadata_benchmark);
criterion_main!(benches);