1 #![feature(test)]
2 
3 extern crate test;
4 
5 use test::Bencher;
6 
7 use csv_core::{Reader, ReaderBuilder};
8 
9 static NFL: &'static str = include_str!("../../examples/data/bench/nfl.csv");
10 static GAME: &'static str = include_str!("../../examples/data/bench/game.csv");
11 static POP: &'static str =
12     include_str!("../../examples/data/bench/worldcitiespop.csv");
13 static MBTA: &'static str =
14     include_str!("../../examples/data/bench/gtfs-mbta-stop-times.csv");
15 
16 macro_rules! bench {
17     ($name:ident, $data:ident, $counter:ident, $result:expr) => {
18         bench!($name, $data, $counter, $result, false);
19     };
20     ($name:ident, $data:ident, $counter:ident, $result:expr, NFA) => {
21         bench!($name, $data, $counter, $result, true);
22     };
23     ($name:ident, $data:ident, $counter:ident, $result:expr, $nfa:expr) => {
24         #[bench]
25         fn $name(b: &mut Bencher) {
26             let data = $data.as_bytes();
27             b.bytes = data.len() as u64;
28             let mut rdr = ReaderBuilder::new().nfa($nfa).build();
29             b.iter(|| {
30                 rdr.reset();
31                 assert_eq!($counter(&mut rdr, data), $result);
32             })
33         }
34     };
35 }
36 
37 bench!(count_nfl_field_copy_dfa, NFL, count_fields, 130000);
38 bench!(count_nfl_field_copy_nfa, NFL, count_fields, 130000, NFA);
39 bench!(count_nfl_record_copy_dfa, NFL, count_records, 10000);
40 bench!(count_nfl_record_copy_nfa, NFL, count_records, 10000, NFA);
41 
42 bench!(count_game_field_copy_dfa, GAME, count_fields, 600000);
43 bench!(count_game_field_copy_nfa, GAME, count_fields, 600000, NFA);
44 bench!(count_game_record_copy_dfa, GAME, count_records, 100000);
45 bench!(count_game_record_copy_nfa, GAME, count_records, 100000, NFA);
46 
47 bench!(count_pop_field_copy_dfa, POP, count_fields, 140007);
48 bench!(count_pop_field_copy_nfa, POP, count_fields, 140007, NFA);
49 bench!(count_pop_record_copy_dfa, POP, count_records, 20001);
50 bench!(count_pop_record_copy_nfa, POP, count_records, 20001, NFA);
51 
52 bench!(count_mbta_field_copy_dfa, MBTA, count_fields, 90000);
53 bench!(count_mbta_field_copy_nfa, MBTA, count_fields, 90000, NFA);
54 bench!(count_mbta_record_copy_dfa, MBTA, count_records, 10000);
55 bench!(count_mbta_record_copy_nfa, MBTA, count_records, 10000, NFA);
56 
count_fields(rdr: &mut Reader, mut data: &[u8]) -> u6457 fn count_fields(rdr: &mut Reader, mut data: &[u8]) -> u64 {
58     use csv_core::ReadFieldResult::*;
59 
60     let mut count = 0;
61     let mut field = [0u8; 1024];
62     loop {
63         let (res, nin, _) = rdr.read_field(data, &mut field);
64         data = &data[nin..];
65         match res {
66             InputEmpty => {}
67             OutputFull => panic!("field too large"),
68             Field { .. } => {
69                 count += 1;
70             }
71             End => break,
72         }
73     }
74     count
75 }
76 
count_records(rdr: &mut Reader, mut data: &[u8]) -> u6477 fn count_records(rdr: &mut Reader, mut data: &[u8]) -> u64 {
78     use csv_core::ReadRecordResult::*;
79 
80     let mut count = 0;
81     let mut record = [0; 8192];
82     let mut ends = [0; 32];
83     loop {
84         let (res, nin, _, _) = rdr.read_record(data, &mut record, &mut ends);
85         data = &data[nin..];
86         match res {
87             InputEmpty => {}
88             OutputFull | OutputEndsFull => panic!("field too large"),
89             Record => count += 1,
90             End => break,
91         }
92     }
93     count
94 }
95