From a9c99885a7321587a566c96293abe15ee9b0bcaf Mon Sep 17 00:00:00 2001 From: Lucas Kent Date: Wed, 6 Sep 2023 16:25:58 +1000 Subject: [PATCH] bench against software implementation --- Cargo.toml | 8 ++--- benches/rand.rs | 93 +++++++++++++++++++++++++------------------------ 2 files changed, 50 insertions(+), 51 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 36e49aa..49a2830 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,8 +17,9 @@ exclude = [ build = "build.rs" [dev-dependencies] -rand = { version ="0.8", features=["alloc", "getrandom"] } -criterion = "0.4" +rand = { version = "0.8", features = ["alloc", "getrandom"] } +criterion = "0.5" +crc = "3.0.1" [build-dependencies] rustc_version = "0.4" @@ -27,6 +28,3 @@ rustc_version = "0.4" name = "rand" path = "benches/rand.rs" harness = false - -[target.aarch64-unknown-linux-gnu] -linker = "aarch64-linux-gnu-gcc" diff --git a/benches/rand.rs b/benches/rand.rs index 0acfe82..056794c 100644 --- a/benches/rand.rs +++ b/benches/rand.rs @@ -1,96 +1,97 @@ -#[macro_use] -extern crate criterion; -extern crate crc32c; -extern crate rand; - +use crc::{Crc, CRC_32_ISCSI}; use crc32c::{crc32c, crc32c_append, crc32c_combine}; -use criterion::{Criterion, Throughput}; +use criterion::{criterion_group, criterion_main, Criterion, Throughput}; use rand::{rngs::OsRng, RngCore}; -fn crc32c_megabyte(c: &mut Criterion) { - let mut bytes = [0u8; 1_000_000]; +const CASTAGNOLI: Crc = Crc::::new(&CRC_32_ISCSI); +const MIB1: usize = 1024 * 1024; +const KIB8: usize = 8 * 1024; +const KIB4: usize = 4 * 1024; + +fn direct_megabyte(c: &mut Criterion) { + let mut bytes = [0u8; MIB1]; OsRng.fill_bytes(&mut bytes); - let mut group = c.benchmark_group("crc32_update_megabytes"); - group.throughput(Throughput::Bytes(1_000_000)); - group.bench_function("crc32_update_megabytes", move |b| b.iter(|| crc32c(&bytes))); + let mut group = c.benchmark_group("1MiB"); + group.throughput(Throughput::Bytes(MIB1 as u64)); + group.bench_function("crc32c", move |b| b.iter(|| crc32c(&bytes))); + group.bench_function("crc_crate", move |b| b.iter(|| CASTAGNOLI.checksum(&bytes))); group.finish(); } -fn crc32c_8kb(c: &mut Criterion) { - let mut buffer = [0u8; 8192]; - OsRng.fill_bytes(&mut buffer); +fn direct_8kib(c: &mut Criterion) { + let mut bytes = [0u8; KIB8]; + OsRng.fill_bytes(&mut bytes); - let mut group = c.benchmark_group("crc32c_8kb"); - group.throughput(Throughput::Bytes(8192)); - group.bench_function("crc32c_8kb", move |b| b.iter(|| crc32c(&buffer))); + let mut group = c.benchmark_group("8KiB"); + group.throughput(Throughput::Bytes(KIB8 as u64)); + group.bench_function("crc32c", move |b| b.iter(|| crc32c(&bytes))); + group.bench_function("crc_crate", move |b| b.iter(|| CASTAGNOLI.checksum(&bytes))); group.finish(); } -/// benchmark combining 4KB blocks into existing check values. -fn crc32c_combine_4kb(c: &mut Criterion) { - let mut buffer = [0u8; 4096]; +/// benchmark combining 4KiB blocks into existing check values. +fn combine_4kib(c: &mut Criterion) { + let mut buffer = [0u8; KIB4]; OsRng.fill_bytes(&mut buffer); let crc_a = crc32c(b"abcd"); let crc_b = crc32c(&buffer); - let mut group = c.benchmark_group("crc32c_combine_4kb"); - group.bench_function("crc32c_combine_4kb", move |b| { + let mut group = c.benchmark_group("combine_4KiB"); + group.bench_function("crc32c", move |b| { b.iter(|| crc32c_combine(crc_a, crc_b, 4096)) }); group.finish(); } -/// benchmark appending 4KB blocks to existing check values -fn crc32c_append_4kb(c: &mut Criterion) { - let mut buffer = [0u8; 4096]; +/// benchmark appending 4KiB blocks to existing check values +fn append_4kib(c: &mut Criterion) { + let mut buffer = [0u8; KIB4]; OsRng.fill_bytes(&mut buffer); let crc_a = crc32c(b"abcd"); - let mut group = c.benchmark_group("crc32c_append_4kb"); - group.bench_function("crc32c_append_4kb", move |b| { - b.iter(|| crc32c_append(crc_a, &buffer)) - }); + let mut group = c.benchmark_group("append_4KiB"); + group.throughput(Throughput::Bytes(KIB4 as u64)); + group.bench_function("crc32c", move |b| b.iter(|| crc32c_append(crc_a, &buffer))); group.finish(); } -/// benchmark combining 1MB blocks into existing check values. -fn crc32c_combine_megabyte(c: &mut Criterion) { - let mut buffer = [0u8; 1_000_000]; +/// benchmark combining 1MiB blocks into existing check values. +fn combine_megabyte(c: &mut Criterion) { + let mut buffer = [0u8; MIB1]; OsRng.fill_bytes(&mut buffer); let crc_a = crc32c(b"abcd"); let crc_b = crc32c(&buffer); - let mut group = c.benchmark_group("crc32c_combine_megabyte"); - group.bench_function("crc32c_combine_megabyte", move |b| { + let mut group = c.benchmark_group("combine_1MiB"); + group.bench_function("crc32c", move |b| { b.iter(|| crc32c_combine(crc_a, crc_b, 1_000_000)) }); group.finish(); } -fn crc32c_append_megabyte(c: &mut Criterion) { - let mut buffer = [0u8; 1_000_000]; +fn append_megabyte(c: &mut Criterion) { + let mut buffer = [0u8; MIB1]; OsRng.fill_bytes(&mut buffer); let crc_a = crc32c(b"abcd"); - let mut group = c.benchmark_group("crc32c_append_megabyte"); - group.bench_function("crc32c_append_megabyte", move |b| { - b.iter(|| crc32c_append(crc_a, &buffer)) - }); + let mut group = c.benchmark_group("append_1MiB"); + group.throughput(Throughput::Bytes(MIB1 as u64)); + group.bench_function("crc32c", move |b| b.iter(|| crc32c_append(crc_a, &buffer))); group.finish(); } criterion_group!( crc, - crc32c_megabyte, - crc32c_8kb, - crc32c_append_4kb, - crc32c_combine_4kb, - crc32c_combine_megabyte, - crc32c_append_megabyte + direct_megabyte, + direct_8kib, + append_4kib, + combine_4kib, + combine_megabyte, + append_megabyte ); criterion_main!(crc);