fast-str 0.1.1

A flexible, easy-to-use, immutable, efficient `String` replacement for Rust.
Documentation
#![allow(clippy::clone_on_copy, clippy::useless_conversion, clippy::clone_double_ref)]

use criterion::{criterion_group, criterion_main, BatchSize, BenchmarkId, Criterion};
use fast_str::FastStr;

pub static FIXTURES: &[(BatchSize, &'static str)] = &[
    (BatchSize::SmallInput, "012345678901234"),
    (BatchSize::LargeInput, "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234"),
];

fn bench_eq(c: &mut Criterion) {
    let mut group = c.benchmark_group("equals");
    for (batch_size, fixture) in FIXTURES.iter().map(Clone::clone) {
        let len = fixture.len();
        group.bench_function(BenchmarkId::new("PartialEq<String, &str>", len), |b| {
            let fixture = (criterion::black_box(String::from(fixture)), criterion::black_box(fixture));
            b.iter_batched(|| &fixture, |(uut1, uut2)| assert!(PartialEq::eq(uut1, uut2)), batch_size)
        });

        group.bench_function(BenchmarkId::new("PartialEq<String, String>", len), |b| {
            let fixture = (criterion::black_box(String::from(fixture)), criterion::black_box(String::from(fixture)));
            b.iter_batched(|| &fixture, |(uut1, uut2)| assert!(PartialEq::eq(uut1, uut2)), batch_size)
        });

        group.bench_function(BenchmarkId::new("PartialEq<FastStr, &str>", len), |b| {
            let fixture = (criterion::black_box(FastStr::from_ref(fixture)), criterion::black_box(fixture));
            b.iter_batched(|| &fixture, |(uut1, uut2)| assert!(PartialEq::eq(uut1, uut2)), batch_size)
        });

        group.bench_function(BenchmarkId::new("PartialEq<FastStr::from_static, &str>", len), |b| {
            let fixture = (criterion::black_box(FastStr::from_static(fixture)), criterion::black_box(fixture));
            b.iter_batched(|| &fixture, |(uut1, uut2)| assert!(PartialEq::eq(uut1, uut2)), batch_size)
        });

        group.bench_function(BenchmarkId::new("PartialEq<FastStr, FastStr>", len), |b| {
            let fixture = (criterion::black_box(FastStr::from_ref(fixture)), criterion::black_box(FastStr::from_ref(fixture)));
            b.iter_batched(|| &fixture, |(uut1, uut2)| assert!(PartialEq::eq(uut1, uut2)), batch_size)
        });

        group.bench_function(BenchmarkId::new("PartialEq<FastStr::from_static, FastStr::from_static>", len), |b| {
            let fixture = (criterion::black_box(FastStr::from_static(fixture)), criterion::black_box(FastStr::from_static(fixture)));
            b.iter_batched(|| &fixture, |(uut1, uut2)| assert!(PartialEq::eq(uut1, uut2)), batch_size)
        });
    }
    group.finish();
}

fn bench_access(c: &mut Criterion) {
    let mut group = c.benchmark_group("access");
    for (batch_size, fixture) in FIXTURES.iter().map(Clone::clone) {
        let len = fixture.len();
        group.bench_function(BenchmarkId::new("String::from", len), |b| {
            let fixture = criterion::black_box(String::from(fixture));
            b.iter_batched(|| &fixture, |uut| uut.len(), batch_size)
        });

        group.bench_function(BenchmarkId::new("FastStr::from_static", len), |b| {
            let fixture = criterion::black_box(FastStr::from_static(fixture));
            b.iter_batched(|| &fixture, |uut| uut.len(), batch_size)
        });

        group.bench_function(BenchmarkId::new("FastStr::from_ref", len), |b| {
            let fixture = criterion::black_box(FastStr::from_ref(fixture));
            b.iter_batched(|| &fixture, |uut| uut.len(), batch_size)
        });

        group.bench_function(BenchmarkId::new("FastStr::from_string", len), |b| {
            let fixture = criterion::black_box(FastStr::from_string(String::from(fixture)));
            b.iter_batched(|| &fixture, |uut| uut.len(), batch_size)
        });
    }
    group.finish();
}

fn bench_clone(c: &mut Criterion) {
    let mut group = c.benchmark_group("clone");
    for (batch_size, fixture) in FIXTURES.iter().map(Clone::clone) {
        let len = fixture.len();
        group.bench_function(BenchmarkId::new("String::from", len), |b| {
            let fixture = criterion::black_box(String::from(fixture));
            b.iter_batched(|| &fixture, |uut| uut.clone(), batch_size)
        });

        group.bench_function(BenchmarkId::new("FastStr::from_static", len), |b| {
            let fixture = criterion::black_box(FastStr::from_static(fixture));
            b.iter_batched(|| &fixture, |uut| uut.clone(), batch_size)
        });

        group.bench_function(BenchmarkId::new("FastStr::from_ref", len), |b| {
            let fixture = criterion::black_box(FastStr::from_ref(fixture));
            b.iter_batched(|| &fixture, |uut| uut.clone(), batch_size)
        });

        group.bench_function(BenchmarkId::new("FastStr::from_string", len), |b| {
            let fixture = criterion::black_box(FastStr::from_string(String::from(fixture)));
            b.iter_batched(|| &fixture, |uut| uut.clone(), batch_size)
        });
    }
    group.finish();
}

criterion_group!(benches, bench_eq, bench_access, bench_clone);
criterion_main!(benches);