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