🏡 index : ~doyle/serde_bson.git

use bytes::BufMut;
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
pub struct A<'a> {
    cool: i32,
    #[serde(with = "serde_bytes")]
    beans: &'a [u8],
    bro: &'a str,
    b: B<'a>,
}

#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
pub enum Test {
    Abc,
    Def(i32),
    Ghi(i32, i32, i32),
    Jkl { a: i32, b: i32 },
}

#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
pub struct Tup(i32, i32);

#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
pub struct B<'a> {
    s: &'a str,
    a: Vec<&'a str>,
    e: Test,
    e2: Test,
    e3: Test,
    e4: Test,
    t: (i32, i32, i32),
    ts: Tup,
    y: bool,
}

fn benchmark(c: &mut Criterion) {
    let data = include_bytes!("../test/test.bin");

    c.bench_function("deserialize: mongodb's bson", |b| {
        b.iter(|| bson::de::from_slice::<A>(black_box(data)))
    });

    c.bench_function("deserialize: serde_bson", |b| {
        b.iter(|| serde_bson::de::from_bytes::<A>(black_box(data)));
    });
}

criterion_group!(benches, benchmark);
criterion_main!(benches);