| #![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 |
| } |