rbx_binary 2.0.1

Implementation of Roblox's binary model (rbxm) and place (rbxl) file formats
Documentation
use criterion::{measurement::Measurement, BatchSize, BenchmarkGroup, Throughput};

pub(crate) fn bench<T: Measurement>(group: &mut BenchmarkGroup<T>, bench_file: &'static [u8]) {
    serialize_bench(group, bench_file);
    deserialize_bench(group, bench_file);
}

fn serialize_bench<T: Measurement>(group: &mut BenchmarkGroup<T>, buffer: &[u8]) {
    let tree = rbx_binary::from_reader(buffer).unwrap();
    let root_ref = tree.root_ref();
    let mut buffer = Vec::new();

    rbx_binary::to_writer(&mut buffer, &tree, &[root_ref]).unwrap();
    let buffer_len = buffer.len();
    let batch_size = if buffer_len > 1024 {
        BatchSize::LargeInput
    } else {
        BatchSize::SmallInput
    };

    group
        .throughput(Throughput::Bytes(buffer_len as u64))
        .bench_function("Serialize", |b| {
            b.iter_batched(
                || Vec::with_capacity(buffer_len),
                |mut buffer: Vec<u8>| {
                    rbx_binary::to_writer(&mut buffer, &tree, &[root_ref]).unwrap();
                },
                batch_size,
            )
        });
}

fn deserialize_bench<T: Measurement>(group: &mut BenchmarkGroup<T>, buffer: &[u8]) {
    group
        .throughput(Throughput::Bytes(buffer.len() as u64))
        .bench_function("Deserialize", |bencher| {
            bencher.iter(|| {
                rbx_binary::from_reader(buffer).unwrap();
            });
        });
}