95 lines
3.1 KiB
Rust
95 lines
3.1 KiB
Rust
#![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
|
|
}
|