blob: 2aa24a92b7a85f687210bbda61e931f527e8f82e [file] [log] [blame]
#![feature(test)]
extern crate test;
use test::Bencher;
use csv_core::{Reader, ReaderBuilder};
static NFL: &'static str = include_str!("../../examples/data/bench/nfl.csv");
static GAME: &'static str = include_str!("../../examples/data/bench/game.csv");
static POP: &'static str =
include_str!("../../examples/data/bench/worldcitiespop.csv");
static MBTA: &'static str =
include_str!("../../examples/data/bench/gtfs-mbta-stop-times.csv");
macro_rules! bench {
($name:ident, $data:ident, $counter:ident, $result:expr) => {
bench!($name, $data, $counter, $result, false);
};
($name:ident, $data:ident, $counter:ident, $result:expr, NFA) => {
bench!($name, $data, $counter, $result, true);
};
($name:ident, $data:ident, $counter:ident, $result:expr, $nfa:expr) => {
#[bench]
fn $name(b: &mut Bencher) {
let data = $data.as_bytes();
b.bytes = data.len() as u64;
let mut rdr = ReaderBuilder::new().nfa($nfa).build();
b.iter(|| {
rdr.reset();
assert_eq!($counter(&mut rdr, data), $result);
})
}
};
}
bench!(count_nfl_field_copy_dfa, NFL, count_fields, 130000);
bench!(count_nfl_field_copy_nfa, NFL, count_fields, 130000, NFA);
bench!(count_nfl_record_copy_dfa, NFL, count_records, 10000);
bench!(count_nfl_record_copy_nfa, NFL, count_records, 10000, NFA);
bench!(count_game_field_copy_dfa, GAME, count_fields, 600000);
bench!(count_game_field_copy_nfa, GAME, count_fields, 600000, NFA);
bench!(count_game_record_copy_dfa, GAME, count_records, 100000);
bench!(count_game_record_copy_nfa, GAME, count_records, 100000, NFA);
bench!(count_pop_field_copy_dfa, POP, count_fields, 140007);
bench!(count_pop_field_copy_nfa, POP, count_fields, 140007, NFA);
bench!(count_pop_record_copy_dfa, POP, count_records, 20001);
bench!(count_pop_record_copy_nfa, POP, count_records, 20001, NFA);
bench!(count_mbta_field_copy_dfa, MBTA, count_fields, 90000);
bench!(count_mbta_field_copy_nfa, MBTA, count_fields, 90000, NFA);
bench!(count_mbta_record_copy_dfa, MBTA, count_records, 10000);
bench!(count_mbta_record_copy_nfa, MBTA, count_records, 10000, NFA);
fn count_fields(rdr: &mut Reader, mut data: &[u8]) -> u64 {
use csv_core::ReadFieldResult::*;
let mut count = 0;
let mut field = [0u8; 1024];
loop {
let (res, nin, _) = rdr.read_field(data, &mut field);
data = &data[nin..];
match res {
InputEmpty => {}
OutputFull => panic!("field too large"),
Field { .. } => {
count += 1;
}
End => break,
}
}
count
}
fn count_records(rdr: &mut Reader, mut data: &[u8]) -> u64 {
use csv_core::ReadRecordResult::*;
let mut count = 0;
let mut record = [0; 8192];
let mut ends = [0; 32];
loop {
let (res, nin, _, _) = rdr.read_record(data, &mut record, &mut ends);
data = &data[nin..];
match res {
InputEmpty => {}
OutputFull | OutputEndsFull => panic!("field too large"),
Record => count += 1,
End => break,
}
}
count
}