//! Benchmarks for implementations of the [Block] trait. //! You can run these with `cargo bench`. use std::{fs::OpenOptions, io::Write, time::Duration}; use btlib::{ crypto::{ConcreteCreds, Creds}, BlockOpenOptions, BlockPath, Epoch, Principaled, SECTOR_SZ_DEFAULT, }; use criterion::{black_box, criterion_group, criterion_main, Criterion}; use tempdir::TempDir; fn block_write(c: &mut Criterion) { let temp_dir = TempDir::new("block_bench").expect("failed to create temp dir"); let root_creds = ConcreteCreds::generate().expect("failed to generate root_creds"); let mut node_creds = ConcreteCreds::generate().expect("failed to generate node_creds"); let components = vec!["nodes".to_string(), "phone".to_string()]; let writecap = root_creds .issue_writecap( node_creds.principal(), components.clone(), Epoch::now() + Duration::from_secs(3600), ) .expect("failed to issue writecap"); node_creds.set_writecap(writecap); let mut fs_path = temp_dir.path().to_owned(); fs_path.extend(components.iter()); std::fs::create_dir_all(&fs_path).expect("failed to create fs_path"); let node_path = BlockPath::new(root_creds.principal(), components); let file_path = fs_path.join("file.txt"); c.bench_function("block_write", |b| { b.iter(|| { let file = OpenOptions::new() .create(true) .truncate(true) .read(true) .write(true) .open(&file_path) .expect("failed to open file"); let mut block = BlockOpenOptions::new() .with_inner(file) .with_creds(node_creds.clone()) .with_encrypt(true) .with_block_path(node_path.clone()) .open() .expect("failed to open block"); const ZEROS: [u8; SECTOR_SZ_DEFAULT] = [0u8; SECTOR_SZ_DEFAULT]; const ITER: usize = (512 * 1024) / ZEROS.len(); for zeros in std::iter::repeat(ZEROS.as_slice()).take(ITER) { block.write(black_box(zeros)).expect("write failed"); } }) }); } criterion_group!(benches, block_write); criterion_main!(benches);