arc-slice 0.1.0

Shared memory slices
Documentation
use std::hint::black_box;

use arc_slice::ArcBytes;
use bytes::Bytes;
use criterion::{criterion_group, criterion_main, BatchSize, Criterion};

fn empty(c: &mut Criterion) {
    let mut group = c.benchmark_group("empty");
    group.bench_function("arcslice", |b| {
        b.iter(<ArcBytes>::default);
    });
    group.bench_function("bytes", |b| {
        b.iter(Bytes::default);
    });
}

fn clone_vec(c: &mut Criterion) {
    let mut group = c.benchmark_group("clone_vec");
    group.bench_function("arcslice", |b| {
        b.iter_batched(
            || <ArcBytes>::from(vec![0u8; 8]),
            |bytes| bytes.clone(),
            BatchSize::SmallInput,
        );
    });
    group.bench_function("bytes", |b| {
        b.iter_batched(
            || Bytes::from(vec![0u8; 8]),
            |bytes| bytes.clone(),
            BatchSize::SmallInput,
        );
    });
}

fn clone_static(c: &mut Criterion) {
    let mut group = c.benchmark_group("clone_static");
    group.bench_function("arcslice", |b| {
        let bytes = <ArcBytes>::from_static(&[]);
        b.iter(|| bytes.clone());
    });
    group.bench_function("bytes", |b| {
        let bytes = Bytes::from_static(&[]);
        b.iter(|| bytes.clone());
    });
}

fn clone_shared(c: &mut Criterion) {
    let mut group = c.benchmark_group("clone_shared");
    group.bench_function("arcslice", |b| {
        let bytes = <ArcBytes>::from(vec![0u8; 8]);
        let _ = bytes.clone();
        b.iter(|| bytes.clone());
    });
    group.bench_function("bytes", |b| {
        let bytes = Bytes::from(vec![0u8; 8]);
        let _ = bytes.clone();
        b.iter(|| bytes.clone());
    });
}

fn subslice_and_split(c: &mut Criterion) {
    let mut group = c.benchmark_group("subslice_and_split");
    group.bench_function("arcslice", |b| {
        b.iter(|| {
            let mut bytes = <ArcBytes>::from_slice(b"Hello world");
            let a = bytes.subslice(0..5);

            assert_eq!(a, b"Hello");

            let b = bytes.split_to(6);

            assert_eq!(bytes, b"world");
            assert_eq!(b, b"Hello ");
        });
    });
    group.bench_function("bytes", |b| {
        b.iter(|| {
            let mut bytes = Bytes::copy_from_slice(b"Hello world");
            let a = bytes.slice(0..5);

            assert_eq!(a, "Hello");

            let b = bytes.split_to(6);

            assert_eq!(bytes, "world");
            assert_eq!(b, "Hello ");
        });
    });
}

fn subslice_and_split_black_box(c: &mut Criterion) {
    let mut group = c.benchmark_group("subslice_and_split_black_box");
    group.bench_function("arcslice", |b| {
        b.iter(|| {
            let mut bytes = <ArcBytes>::from_slice(b"Hello world");
            let a = black_box(&bytes).subslice(0..5);

            assert_eq!(black_box(&a), b"Hello");

            let b = black_box(&mut bytes).split_to(6);

            assert_eq!(black_box(&bytes), b"world");
            assert_eq!(black_box(&b), b"Hello ");
        });
    });
    group.bench_function("bytes", |b| {
        b.iter(|| {
            let mut bytes = Bytes::copy_from_slice(b"Hello world");
            let a = black_box(&bytes).slice(0..5);

            assert_eq!(black_box(&a), "Hello");

            let b = black_box(&mut bytes).split_to(6);

            assert_eq!(black_box(&bytes), "world");
            assert_eq!(black_box(&b), "Hello ");
        });
    });
}
criterion_group!(
    benches,
    empty,
    clone_vec,
    clone_static,
    clone_shared,
    subslice_and_split,
    subslice_and_split_black_box,
);
criterion_main!(benches);