benches/lib.rs (132 lines of code) (raw):

#![feature(test)] #![allow(clippy::unit_arg)] extern crate test; use crossbeam_channel::unbounded; use grcov::{CovResult, Function, FunctionMap}; use rustc_hash::FxHashMap; use std::path::PathBuf; use std::sync::{Arc, Mutex}; use std::thread; use test::{black_box, Bencher}; use grcov::*; #[bench] fn bench_lib_merge_results(b: &mut Bencher) { let mut functions1: FunctionMap = FxHashMap::default(); functions1.insert( "f1".to_string(), Function { start: 1, executed: false, }, ); functions1.insert( "f2".to_string(), Function { start: 2, executed: false, }, ); let mut result = CovResult { lines: [(1, 21), (2, 7), (7, 0)].iter().cloned().collect(), branches: [ (1, vec![false, false]), (2, vec![false, true]), (4, vec![true]), ] .iter() .cloned() .collect(), functions: functions1, }; let mut functions2: FunctionMap = FxHashMap::default(); functions2.insert( "f1".to_string(), Function { start: 1, executed: false, }, ); functions2.insert( "f2".to_string(), Function { start: 2, executed: true, }, ); let result2 = CovResult { lines: [(1, 21), (3, 42), (4, 7), (2, 0), (8, 0)] .iter() .cloned() .collect(), branches: [ (1, vec![false, false]), (2, vec![false, true]), (3, vec![true]), ] .iter() .cloned() .collect(), functions: functions2, }; b.iter(|| black_box(grcov::merge_results(&mut result, result2.clone()))); } #[bench] fn bench_lib_consumer(b: &mut Bencher) { let num_threads = 2; let result_map: Arc<SyncCovResultMap> = Arc::new(Mutex::new( FxHashMap::with_capacity_and_hasher(20_000, Default::default()), )); let (sender, receiver) = unbounded(); let working_dir = PathBuf::from(""); let gcno_buf: Vec<u8> = vec![ 111, 110, 99, 103, 42, 50, 48, 52, 74, 200, 254, 66, 0, 0, 0, 1, 9, 0, 0, 0, 0, 0, 0, 0, 236, 217, 93, 255, 2, 0, 0, 0, 109, 97, 105, 110, 0, 0, 0, 0, 2, 0, 0, 0, 102, 105, 108, 101, 46, 99, 0, 0, 1, 0, 0, 0, 0, 0, 65, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 1, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 1, 3, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 1, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 102, 105, 108, 101, 46, 99, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; b.iter(|| { let mut parsers = Vec::new(); for i in 0..num_threads { let receiver = receiver.clone(); let result_map = Arc::clone(&result_map); let working_dir = working_dir.clone(); let t = thread::Builder::new() .name(format!("Consumer {}", i)) .spawn(move || { consumer( &working_dir, None, &result_map, receiver, false, false, None, ); }) .unwrap(); parsers.push(t); } for _ in 0..10_000 { sender .send(Some(WorkItem { format: ItemFormat::Gcno, item: ItemType::Buffers(GcnoBuffers { stem: "".to_string(), gcno_buf: gcno_buf.clone(), gcda_buf: Vec::new(), }), name: "".to_string(), })) .unwrap(); } for _ in 0..num_threads { sender.send(None).unwrap(); } for parser in parsers { parser.join().unwrap(); } }); }