#![feature(test)] extern crate test; use test::Bencher; use csv_core::{Reader, ReaderBuilder}; static NFL: &'static str = include_str!("../../examples/data/bench/nfl.csv"); static GAME: &'static str = include_str!("../../examples/data/bench/game.csv"); static POP: &'static str = include_str!("../../examples/data/bench/worldcitiespop.csv"); static MBTA: &'static str = include_str!("../../examples/data/bench/gtfs-mbta-stop-times.csv"); macro_rules! bench { ($name:ident, $data:ident, $counter:ident, $result:expr) => { bench!($name, $data, $counter, $result, false); }; ($name:ident, $data:ident, $counter:ident, $result:expr, NFA) => { bench!($name, $data, $counter, $result, true); }; ($name:ident, $data:ident, $counter:ident, $result:expr, $nfa:expr) => { #[bench] fn $name(b: &mut Bencher) { let data = $data.as_bytes(); b.bytes = data.len() as u64; let mut rdr = ReaderBuilder::new().nfa($nfa).build(); b.iter(|| { rdr.reset(); assert_eq!($counter(&mut rdr, data), $result); }) } }; } bench!(count_nfl_field_copy_dfa, NFL, count_fields, 130000); bench!(count_nfl_field_copy_nfa, NFL, count_fields, 130000, NFA); bench!(count_nfl_record_copy_dfa, NFL, count_records, 10000); bench!(count_nfl_record_copy_nfa, NFL, count_records, 10000, NFA); bench!(count_game_field_copy_dfa, GAME, count_fields, 600000); bench!(count_game_field_copy_nfa, GAME, count_fields, 600000, NFA); bench!(count_game_record_copy_dfa, GAME, count_records, 100000); bench!(count_game_record_copy_nfa, GAME, count_records, 100000, NFA); bench!(count_pop_field_copy_dfa, POP, count_fields, 140007); bench!(count_pop_field_copy_nfa, POP, count_fields, 140007, NFA); bench!(count_pop_record_copy_dfa, POP, count_records, 20001); bench!(count_pop_record_copy_nfa, POP, count_records, 20001, NFA); bench!(count_mbta_field_copy_dfa, MBTA, count_fields, 90000); bench!(count_mbta_field_copy_nfa, MBTA, count_fields, 90000, NFA); bench!(count_mbta_record_copy_dfa, MBTA, count_records, 10000); bench!(count_mbta_record_copy_nfa, MBTA, count_records, 10000, NFA); fn count_fields(rdr: &mut Reader, mut data: &[u8]) -> u64 { use csv_core::ReadFieldResult::*; let mut count = 0; let mut field = [0u8; 1024]; loop { let (res, nin, _) = rdr.read_field(data, &mut field); data = &data[nin..]; match res { InputEmpty => {} OutputFull => panic!("field too large"), Field { .. } => { count += 1; } End => break, } } count } fn count_records(rdr: &mut Reader, mut data: &[u8]) -> u64 { use csv_core::ReadRecordResult::*; let mut count = 0; let mut record = [0; 8192]; let mut ends = [0; 32]; loop { let (res, nin, _, _) = rdr.read_record(data, &mut record, &mut ends); data = &data[nin..]; match res { InputEmpty => {} OutputFull | OutputEndsFull => panic!("field too large"), Record => count += 1, End => break, } } count }