File: buffers.rs

package info (click to toggle)
chromium 140.0.7339.127-1
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 6,192,880 kB
  • sloc: cpp: 35,093,808; ansic: 7,161,670; javascript: 4,199,694; python: 1,441,797; asm: 949,904; xml: 747,503; pascal: 187,748; perl: 88,691; sh: 88,248; objc: 79,953; sql: 52,714; cs: 44,599; fortran: 24,137; makefile: 22,114; tcl: 15,277; php: 13,980; yacc: 9,000; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (86 lines) | stat: -rw-r--r-- 2,455 bytes parent folder | download | duplicates (6)
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);