use std::time::Duration;
use criterion::Criterion;
use diskann_disk::utils::aligned_file_reader::{
traits::{AlignedFileReader, AlignedReaderFactory},
AlignedFileReaderFactory, AlignedRead,
};
use diskann_quantization::{alloc::aligned_slice, num::PowerOfTwo};
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 =
aligned_slice::<u8>(read_length * num_read, PowerOfTwo::new(512).unwrap()).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());
})
});
}