]>
Commit | Line | Data |
---|---|---|
49aad941 FG |
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 | ||
57 | 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 | ||
77 | 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 | } |