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