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