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);