1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
#![cfg(feature = "std")]
use {
combine::{
parser::{
byte::take_until_bytes,
combinator::{any_send_sync_partial_state, recognize, AnySendSyncPartialState},
},
Parser, RangeStream,
},
criterion::{black_box, criterion_group, criterion_main, Bencher, Criterion},
partial_io::{PartialOp, PartialRead},
std::io::Cursor,
};
fn test_data() -> Vec<u8> {
let mut input = vec![b' '; 5_000_000];
input.push(b'1');
input
}
fn parser<'a, I>() -> impl combine::Parser<I, Output = usize, PartialState = AnySendSyncPartialState>
where
I: RangeStream<Token = u8, Range = &'a [u8]>,
I::Error: combine::ParseError<u8, &'a [u8], I::Position>,
{
any_send_sync_partial_state(
recognize(take_until_bytes(&b"1"[..])).map(|spaces: Vec<u8>| spaces.len()),
)
}
fn bench_small_buf(bencher: &mut Bencher<'_>) {
let input = test_data();
let mut decoder = combine::stream::decoder::Decoder::new();
bencher.iter(|| {
let cursor = Cursor::new(&input);
let mut partial_read =
PartialRead::new(cursor, std::iter::repeat(PartialOp::Limited(1000)));
let mut ref_decoder = &mut decoder;
let result = combine::decode!(ref_decoder, partial_read, parser(), |input, _position| {
combine::easy::Stream::from(input)
},);
match result {
Ok(usize) => black_box(usize),
Err(err) => {
println!("{:?}", err);
panic!();
}
};
});
}
fn bench_big_buf(bencher: &mut Bencher<'_>) {
let input = test_data();
let mut decoder = combine::stream::decoder::Decoder::new();
bencher.iter(|| {
let cursor = Cursor::new(&input);
let mut partial_read = PartialRead::new(cursor, std::iter::repeat(PartialOp::Unlimited));
let mut ref_decoder = &mut decoder;
let result = combine::decode!(ref_decoder, partial_read, parser(), |input, _position| {
combine::easy::Stream::from(input)
},);
match result {
Ok(usize) => black_box(usize),
Err(err) => {
println!("{:?}", err);
panic!();
}
};
});
}
fn bench(c: &mut Criterion) {
c.bench_function("buffers_small", bench_small_buf);
c.bench_function("buffers_big", bench_big_buf);
}
criterion_group!(buffers, bench);
criterion_main!(buffers);
|