#![feature(test)] extern crate test; use crc::*; use test::{black_box, Bencher}; pub const BLUETOOTH: Crc = Crc::::new(&CRC_8_BLUETOOTH); pub const BLUETOOTH_SLICE16: Crc> = Crc::>::new(&CRC_8_BLUETOOTH); pub const BLUETOOTH_BYTEWISE: Crc> = Crc::>::new(&CRC_8_BLUETOOTH); pub const BLUETOOTH_NOLOOKUP: Crc = Crc::::new(&CRC_8_BLUETOOTH); pub const X25: Crc = Crc::::new(&CRC_16_IBM_SDLC); pub const X25_SLICE16: Crc> = Crc::>::new(&CRC_16_IBM_SDLC); pub const X25_BYTEWISE: Crc> = Crc::>::new(&CRC_16_IBM_SDLC); pub const X25_NOLOOKUP: Crc = Crc::::new(&CRC_16_IBM_SDLC); pub const ISCSI: Crc = Crc::::new(&CRC_32_ISCSI); pub const ISCSI_SLICE16: Crc> = Crc::>::new(&CRC_32_ISCSI); pub const ISCSI_BYTEWISE: Crc> = Crc::>::new(&CRC_32_ISCSI); pub const ISCSI_NOLOOKUP: Crc = Crc::::new(&CRC_32_ISCSI); pub const GSM_40: Crc = Crc::::new(&CRC_40_GSM); pub const ECMA: Crc = Crc::::new(&CRC_64_ECMA_182); pub const ECMA_SLICE16: Crc> = Crc::>::new(&CRC_64_ECMA_182); pub const ECMA_BYTEWISE: Crc> = Crc::>::new(&CRC_64_ECMA_182); pub const ECMA_NOLOOKUP: Crc = Crc::::new(&CRC_64_ECMA_182); pub const DARC: Crc = Crc::::new(&CRC_82_DARC); pub const DARC_SLICE16: Crc> = Crc::>::new(&CRC_82_DARC); pub const DARC_BYTEWISE: Crc> = Crc::>::new(&CRC_82_DARC); pub const DARC_NOLOOKUP: Crc = Crc::::new(&CRC_82_DARC); static KB: usize = 1024; // Baseline benchmark fn baseline(data: &[u8]) -> usize { data.iter() .fold(0usize, |acc, v| acc.wrapping_add(*v as usize)) } #[bench] fn bench_baseline(b: &mut Bencher) { let size = 16 * KB; let bytes = vec![0u8; size]; b.bytes = size as u64; b.iter(|| baseline(black_box(&bytes))); } // CRC-8 benchmarks #[bench] fn bench_crc8_nolookup(b: &mut Bencher) { let size = 16 * KB; let bytes = vec![0u8; size]; b.bytes = size as u64; b.iter(|| BLUETOOTH_NOLOOKUP.checksum(black_box(&bytes))); } #[bench] fn bench_crc8_bytewise(b: &mut Bencher) { let size = 16 * KB; let bytes = vec![0u8; size]; b.bytes = size as u64; b.iter(|| BLUETOOTH_BYTEWISE.checksum(black_box(&bytes))); } #[bench] fn bench_crc8_slice16(b: &mut Bencher) { let size = 16 * KB; let bytes = vec![0u8; size]; b.bytes = size as u64; b.iter(|| BLUETOOTH_SLICE16.checksum(black_box(&bytes))); } // CRC-16 benchmarks #[bench] fn bench_crc16_nolookup(b: &mut Bencher) { let size = 16 * KB; let bytes = vec![0u8; size]; b.bytes = size as u64; b.iter(|| X25_NOLOOKUP.checksum(black_box(&bytes))); } #[bench] fn bench_crc16_bytewise(b: &mut Bencher) { let size = 16 * KB; let bytes = vec![0u8; size]; b.bytes = size as u64; b.iter(|| X25_BYTEWISE.checksum(black_box(&bytes))); } #[bench] fn bench_crc16_slice16(b: &mut Bencher) { let size = 16 * KB; let bytes = vec![0u8; size]; b.bytes = size as u64; b.iter(|| X25_SLICE16.checksum(black_box(&bytes))); } // CRC-32 benchmarks #[bench] fn bench_crc32_nolookup(b: &mut Bencher) { let size = 16 * KB; let bytes = vec![0u8; size]; b.bytes = size as u64; b.iter(|| ISCSI_NOLOOKUP.checksum(black_box(&bytes))); } #[bench] fn bench_crc32_bytewise(b: &mut Bencher) { let size = 16 * KB; let bytes = vec![0u8; size]; b.bytes = size as u64; b.iter(|| ISCSI_BYTEWISE.checksum(black_box(&bytes))); } #[bench] fn bench_crc32_slice16(b: &mut Bencher) { let size = 16 * KB; let bytes = vec![0u8; size]; b.bytes = size as u64; b.iter(|| ISCSI_SLICE16.checksum(black_box(&bytes))); } // CRC-64 benchmarks #[bench] fn bench_crc64_nolookup(b: &mut Bencher) { let size = 16 * KB; let bytes = vec![0u8; size]; b.bytes = size as u64; b.iter(|| ECMA_NOLOOKUP.checksum(black_box(&bytes))); } #[bench] fn bench_crc64_bytewise(b: &mut Bencher) { let size = 16 * KB; let bytes = vec![0u8; size]; b.bytes = size as u64; b.iter(|| ECMA_BYTEWISE.checksum(black_box(&bytes))); } #[bench] fn bench_crc64_slice16(b: &mut Bencher) { let size = 16 * KB; let bytes = vec![0u8; size]; b.bytes = size as u64; b.iter(|| ECMA_SLICE16.checksum(black_box(&bytes))); } // CRC-82 benchmarks #[bench] fn bench_crc82_nolookup(b: &mut Bencher) { let size = 16 * KB; let bytes = vec![0u8; size]; b.bytes = size as u64; b.iter(|| DARC_NOLOOKUP.checksum(black_box(&bytes))); } #[bench] fn bench_crc82_bytewise(b: &mut Bencher) { let size = 16 * KB; let bytes = vec![0u8; size]; b.bytes = size as u64; b.iter(|| DARC_BYTEWISE.checksum(black_box(&bytes))); } #[bench] fn bench_crc82_slice16(b: &mut Bencher) { let size = 16 * KB; let bytes = vec![0u8; size]; b.bytes = size as u64; b.iter(|| DARC_SLICE16.checksum(black_box(&bytes))); } // Miscellaneous benchmarks #[bench] fn bench_crc40(b: &mut Bencher) { let size = 16 * KB; let bytes = vec![0u8; size]; b.bytes = size as u64; b.iter(|| GSM_40.checksum(black_box(&bytes))); }