#[path = "common/mod.rs"]
mod common;
use std::path::Path;
use std::time::Duration;
use codenexus::index::IndexFacade;
use criterion::{black_box, criterion_group, criterion_main, BatchSize, Criterion, Throughput};
use common::generate_large_repo;
const FILE_COUNT: usize = 1000;
const PROJECT_NAME: &str = "incremental_bench";
const LANGUAGES: &[&str] = &["rs", "c", "f90", "py", "ts"];
fn modify_files(dir: &Path, count: usize) {
for i in 0..count {
let ext = LANGUAGES[i % LANGUAGES.len()];
let path = dir.join(format!("file_{i}.{ext}"));
let original = std::fs::read_to_string(&path).expect("read fixture for modify");
let suffix = match ext {
"f90" => "\n! bench modify\n",
_ => "\n// bench modify\n",
};
std::fs::write(&path, format!("{original}{suffix}")).expect("write modified fixture");
}
}
fn bench_cold_start_1000(c: &mut Criterion) {
let mut group = c.benchmark_group("incremental");
group.throughput(Throughput::Elements(FILE_COUNT as u64));
group.sample_size(10);
group.bench_function("cold_start_1000", |b| {
b.iter_batched(
|| {
let dir = generate_large_repo(FILE_COUNT);
let db_path = dir.path().join("bench.db");
let facade = IndexFacade::new(&db_path).expect("IndexFacade::new");
(dir, facade)
},
|(dir, facade)| {
let result = facade
.index(dir.path(), PROJECT_NAME, false)
.expect("cold-start index");
black_box(result);
},
BatchSize::PerIteration,
);
});
group.finish();
}
fn bench_incremental_1_of_1000(c: &mut Criterion) {
let mut group = c.benchmark_group("incremental");
group.throughput(Throughput::Elements(FILE_COUNT as u64));
group.sample_size(10);
group.bench_function("incremental_1_of_1000", |b| {
b.iter_batched(
|| {
let dir = generate_large_repo(FILE_COUNT);
let db_path = dir.path().join("bench.db");
let facade = IndexFacade::new(&db_path).expect("IndexFacade::new");
facade
.index(dir.path(), PROJECT_NAME, false)
.expect("warm-up index");
modify_files(dir.path(), 1);
(dir, facade)
},
|(dir, facade)| {
let result = facade
.index_incremental(dir.path(), PROJECT_NAME, false)
.expect("incremental_1 index");
black_box(result);
},
BatchSize::PerIteration,
);
});
group.finish();
}
fn bench_incremental_500_of_1000(c: &mut Criterion) {
let mut group = c.benchmark_group("incremental");
group.throughput(Throughput::Elements(FILE_COUNT as u64));
group.sample_size(10);
group.measurement_time(Duration::from_secs(300));
group.bench_function("incremental_500_of_1000", |b| {
b.iter_batched(
|| {
let dir = generate_large_repo(FILE_COUNT);
let db_path = dir.path().join("bench.db");
let facade = IndexFacade::new(&db_path).expect("IndexFacade::new");
facade
.index(dir.path(), PROJECT_NAME, false)
.expect("warm-up index");
modify_files(dir.path(), 500);
(dir, facade)
},
|(dir, facade)| {
let result = facade
.index_incremental(dir.path(), PROJECT_NAME, false)
.expect("incremental_500 index");
black_box(result);
},
BatchSize::PerIteration,
);
});
group.finish();
}
criterion_group!(
benches,
bench_cold_start_1000,
bench_incremental_1_of_1000,
bench_incremental_500_of_1000,
);
criterion_main!(benches);