use std::fs::File; use std::io::{self, Read}; use criterion::*; use inferno::collapse::{dtrace, perf, sample, Collapse}; use lazy_static::lazy_static; use libflate::gzip::Decoder; const INFILE_DTRACE: &str = "flamegraph/example-dtrace-stacks.txt"; const INFILE_PERF: &str = "flamegraph/example-perf-stacks.txt.gz"; const INFILE_SAMPLE: &str = "tests/data/collapse-sample/large.txt.gz"; const SAMPLE_SIZE: usize = 100; lazy_static! { static ref NTHREADS: usize = num_cpus::get(); } fn read_infile(infile: &str, buf: &mut Vec) -> io::Result<()> { let mut f = File::open(infile)?; if infile.ends_with(".gz") { let mut r = io::BufReader::new(Decoder::new(f)?); r.read_to_end(buf)?; } else { f.read_to_end(buf)?; } Ok(()) } macro_rules! benchmark_single { ($name:ident, $name_str:expr, $infile:expr) => { fn $name(c: &mut Criterion) { let mut bytes = Vec::new(); read_infile($infile, &mut bytes).unwrap(); let mut collapser = $name::Folder::default(); c.bench( "collapse", ParameterizedBenchmark::new( $name_str, move |b, data| { b.iter(|| { let _result = collapser.collapse(data.as_slice(), io::sink()); }) }, vec![bytes], ) .throughput(|bytes| Throughput::Bytes(bytes.len() as u64)) .sample_size(SAMPLE_SIZE), ); } }; } macro_rules! benchmark_multi { ($name:ident, $name_str:expr, $infile:expr) => { fn $name(c: &mut Criterion) { let mut bytes = Vec::new(); read_infile($infile, &mut bytes).unwrap(); let mut collapser1 = { let mut options = $name::Options::default(); options.nthreads = 1; $name::Folder::from(options) }; let mut collapser2 = { let mut options = $name::Options::default(); options.nthreads = *NTHREADS; $name::Folder::from(options) }; c.bench( "collapse", ParameterizedBenchmark::new( format!("{}/1", $name_str), move |b, data| { b.iter(|| { let _result = collapser1.collapse(data.as_slice(), io::sink()); }) }, vec![bytes], ) .with_function(format!("{}/{}", $name_str, *NTHREADS), move |b, data| { b.iter(|| { let _result = collapser2.collapse(data.as_slice(), io::sink()); }) }) .throughput(|bytes| Throughput::Bytes(bytes.len() as u64)) .sample_size(SAMPLE_SIZE), ); } }; } benchmark_multi!(dtrace, "dtrace", INFILE_DTRACE); benchmark_multi!(perf, "perf", INFILE_PERF); benchmark_single!(sample, "sample", INFILE_SAMPLE); criterion_group!(benches, dtrace, perf, sample); criterion_main!(benches);