titan-api-codec 1.2.6

Helpers for encoding and decoding Titan API messages
Documentation
use std::hint::black_box;
use std::io::Read;

use brotli::BrotliCompress;
use bytes::{Buf, BufMut, Bytes, BytesMut};
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
use flate2::bufread::GzEncoder;
use lipsum::lipsum;
use zstd::bulk::compress;

use titan_api_codec::transform::brotli::{BrotliCompressor, BrotliDecompressor};
use titan_api_codec::transform::gzip::{GzipCompressor, GzipDecompressor};
use titan_api_codec::transform::zstd::{ZstdCompressor, ZstdDecompressor};
use titan_api_codec::transform::BinaryTransform;

pub fn bench_zstd_compress(c: &mut Criterion) {
    let mut group = c.benchmark_group("zstd_compress");
    let compressor = ZstdCompressor::default();
    for words in [10, 100, 1000].iter() {
        let data = Bytes::from(lipsum(*words));
        group.throughput(criterion::Throughput::Bytes(data.len() as u64));
        group.bench_with_input(BenchmarkId::from_parameter(data.len()), &data, |b, data| {
            b.iter(|| compressor.transform(black_box(data.clone())))
        });
    }
}

pub fn bench_zstd_compress_mut(c: &mut Criterion) {
    let mut group = c.benchmark_group("zstd_compress_mut");
    let mut compressor = ZstdCompressor::default();
    for words in [10, 100, 1000].iter() {
        let data = Bytes::from(lipsum(*words));
        group.throughput(criterion::Throughput::Bytes(data.len() as u64));
        group.bench_with_input(BenchmarkId::from_parameter(data.len()), &data, |b, data| {
            b.iter(|| compressor.transform_mut(black_box(data.clone())))
        });
    }
}

pub fn bench_zstd_decompress(c: &mut Criterion) {
    let mut group = c.benchmark_group("zstd_decompress");
    let decompressor = ZstdDecompressor::default();
    for words in [10, 100, 1000].iter() {
        let data = Bytes::from(lipsum(*words));
        let compressed =
            Bytes::from(compress(&data, 0).expect("should be able to compress test data"));
        group.throughput(criterion::Throughput::Bytes(data.len() as u64));
        group.bench_with_input(
            BenchmarkId::from_parameter(data.len()),
            &compressed,
            |b, data| b.iter(|| decompressor.transform(black_box(data.clone()))),
        );
    }
}

pub fn bench_zstd_decompress_mut(c: &mut Criterion) {
    let mut group = c.benchmark_group("zstd_decompress_mut");
    let mut decompressor = ZstdDecompressor::default();
    for words in [10, 100, 1000].iter() {
        let data = lipsum(*words);
        let compressed = Bytes::from(
            compress(data.as_bytes(), 0).expect("should be able to compress test data"),
        );
        group.throughput(criterion::Throughput::Bytes(data.len() as u64));
        group.bench_with_input(
            BenchmarkId::from_parameter(data.len()),
            &compressed,
            |b, data| b.iter(|| decompressor.transform_mut(black_box(data.clone()))),
        );
    }
}

pub fn bench_brotli_compress(c: &mut Criterion) {
    let mut group = c.benchmark_group("brotli_compress");
    let compressor = BrotliCompressor::default();
    for words in [10, 100, 1000].iter() {
        let data = Bytes::from(lipsum(*words));
        group.throughput(criterion::Throughput::Bytes(data.len() as u64));
        group.bench_with_input(BenchmarkId::from_parameter(data.len()), &data, |b, data| {
            b.iter(|| compressor.transform(black_box(data.clone())))
        });
    }
}

pub fn bench_brotli_compress_mut(c: &mut Criterion) {
    let mut group = c.benchmark_group("brotli_compress_mut");
    let mut compressor = BrotliCompressor::default();
    for words in [10, 100, 1000].iter() {
        let data = Bytes::from(lipsum(*words));
        group.throughput(criterion::Throughput::Bytes(data.len() as u64));
        group.bench_with_input(BenchmarkId::from_parameter(data.len()), &data, |b, data| {
            b.iter(|| compressor.transform_mut(black_box(data.clone())))
        });
    }
}

pub fn bench_brotli_decompress(c: &mut Criterion) {
    let mut group = c.benchmark_group("brotli_decompress");
    let decompressor = BrotliDecompressor::default();
    for words in [10, 100, 1000].iter() {
        let data = Bytes::from(lipsum(*words));
        let mut buffer = BytesMut::new().writer();
        BrotliCompress(&mut data.clone().reader(), &mut buffer, &Default::default())
            .expect("should be able to compress test data");
        let compressed = buffer.into_inner().freeze();
        group.throughput(criterion::Throughput::Bytes(data.len() as u64));
        group.bench_with_input(
            BenchmarkId::from_parameter(data.len()),
            &compressed,
            |b, data| b.iter(|| decompressor.transform(black_box(data.clone()))),
        );
    }
}

pub fn bench_brotli_decompress_mut(c: &mut Criterion) {
    let mut group = c.benchmark_group("brotli_decompress_mut");
    let mut decompressor = BrotliDecompressor::default();
    for words in [10, 100, 1000].iter() {
        let data = Bytes::from(lipsum(*words));
        let mut buffer = BytesMut::new().writer();
        BrotliCompress(&mut data.clone().reader(), &mut buffer, &Default::default())
            .expect("should be able to compress test data");
        let compressed = buffer.into_inner().freeze();
        group.throughput(criterion::Throughput::Bytes(data.len() as u64));
        group.bench_with_input(
            BenchmarkId::from_parameter(data.len()),
            &compressed,
            |b, data| b.iter(|| decompressor.transform_mut(black_box(data.clone()))),
        );
    }
}

pub fn bench_gzip_compress(c: &mut Criterion) {
    let mut group = c.benchmark_group("gzip_compress");
    let compressor = GzipCompressor::default();
    for words in [10, 100, 1000].iter() {
        let data = Bytes::from(lipsum(*words));
        group.throughput(criterion::Throughput::Bytes(data.len() as u64));
        group.bench_with_input(BenchmarkId::from_parameter(data.len()), &data, |b, data| {
            b.iter(|| compressor.transform(black_box(data.clone())))
        });
    }
}

pub fn bench_gzip_decompress(c: &mut Criterion) {
    let mut group = c.benchmark_group("gzip_decompress");
    let decompressor = GzipDecompressor::default();
    for words in [10, 100, 1000].iter() {
        let data = Bytes::from(lipsum(*words));
        let mut encoder = GzEncoder::new(data.clone().reader(), flate2::Compression::default());
        let mut buffer = Vec::new();
        encoder
            .read_to_end(&mut buffer)
            .expect("should be able to compress test data");
        let compressed = Bytes::from(buffer);
        group.throughput(criterion::Throughput::Bytes(data.len() as u64));
        group.bench_with_input(
            BenchmarkId::from_parameter(data.len()),
            &compressed,
            |b, data| b.iter(|| decompressor.transform(black_box(data.clone()))),
        );
    }
}

criterion_group!(
    zstd,
    bench_zstd_compress,
    bench_zstd_compress_mut,
    bench_zstd_decompress,
    bench_zstd_decompress_mut
);
criterion_group!(
    brotli,
    bench_brotli_compress,
    bench_brotli_compress_mut,
    bench_brotli_decompress,
    bench_brotli_decompress_mut
);
criterion_group!(gzip, bench_gzip_compress, bench_gzip_decompress);
criterion_main!(zstd, brotli, gzip);