use std::time::Duration;
use criterion::Criterion;
use diskann_disk::search::provider::aligned_file_reader::{
traits::{AlignedFileReader, AlignedReaderFactory},
AlignedFileReaderFactory, AlignedRead,
};
use diskann_quantization::alloc::{AlignedAllocator, Poly};
pub const TEST_INDEX_PATH: &str =
"../test_data/disk_index_misc/disk_index_siftsmall_learn_256pts_R4_L50_A1.2_aligned_reader_test.index";
const MAX_IO_CONCURRENCY: usize = 128;
pub fn benchmark_aligned_file_reader(c: &mut Criterion) {
let mut reader = AlignedFileReaderFactory::new(TEST_INDEX_PATH.to_string())
.build()
.unwrap();
let read_length = 512;
let num_read = MAX_IO_CONCURRENCY * 100; let mut aligned_mem =
Poly::broadcast(0u8, read_length * num_read, AlignedAllocator::A512).unwrap();
let mut mem_slices: Vec<&mut [u8]> = aligned_mem.chunks_mut(read_length).collect();
let mut aligned_reads: Vec<AlignedRead<'_, u8, _>> = mem_slices
.iter_mut()
.map(|slice| AlignedRead::new(0, slice).unwrap())
.collect();
let mut group = c.benchmark_group("aligned_file_reader");
group.sample_size(500);
group.warm_up_time(Duration::from_secs(5));
group.measurement_time(Duration::from_secs(15));
group.bench_function("Read using AlignedFileReader", |bencher| {
bencher.iter(|| {
let result = reader.read(&mut aligned_reads);
assert!(result.is_ok());
})
});
}