aboutsummaryrefslogtreecommitdiff
path: root/thirdparty/BLAKE3/benches/bench.rs
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/BLAKE3/benches/bench.rs')
-rw-r--r--thirdparty/BLAKE3/benches/bench.rs520
1 files changed, 0 insertions, 520 deletions
diff --git a/thirdparty/BLAKE3/benches/bench.rs b/thirdparty/BLAKE3/benches/bench.rs
deleted file mode 100644
index ba5a4041f..000000000
--- a/thirdparty/BLAKE3/benches/bench.rs
+++ /dev/null
@@ -1,520 +0,0 @@
-#![feature(test)]
-
-extern crate test;
-
-use arrayref::array_ref;
-use arrayvec::ArrayVec;
-use blake3::platform::{Platform, MAX_SIMD_DEGREE};
-use blake3::{BLOCK_LEN, CHUNK_LEN, OUT_LEN};
-use rand::prelude::*;
-use test::Bencher;
-
-const KIB: usize = 1024;
-
-// This struct randomizes two things:
-// 1. The actual bytes of input.
-// 2. The page offset the input starts at.
-pub struct RandomInput {
- buf: Vec<u8>,
- len: usize,
- offsets: Vec<usize>,
- offset_index: usize,
-}
-
-impl RandomInput {
- pub fn new(b: &mut Bencher, len: usize) -> Self {
- b.bytes += len as u64;
- let page_size: usize = page_size::get();
- let mut buf = vec![0u8; len + page_size];
- let mut rng = rand::thread_rng();
- rng.fill_bytes(&mut buf);
- let mut offsets: Vec<usize> = (0..page_size).collect();
- offsets.shuffle(&mut rng);
- Self {
- buf,
- len,
- offsets,
- offset_index: 0,
- }
- }
-
- pub fn get(&mut self) -> &[u8] {
- let offset = self.offsets[self.offset_index];
- self.offset_index += 1;
- if self.offset_index >= self.offsets.len() {
- self.offset_index = 0;
- }
- &self.buf[offset..][..self.len]
- }
-}
-
-fn bench_single_compression_fn(b: &mut Bencher, platform: Platform) {
- let mut state = [1u32; 8];
- let mut r = RandomInput::new(b, 64);
- let input = array_ref!(r.get(), 0, 64);
- b.iter(|| platform.compress_in_place(&mut state, input, 64 as u8, 0, 0));
-}
-
-#[bench]
-fn bench_single_compression_portable(b: &mut Bencher) {
- bench_single_compression_fn(b, Platform::portable());
-}
-
-#[bench]
-#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
-fn bench_single_compression_sse2(b: &mut Bencher) {
- if let Some(platform) = Platform::sse2() {
- bench_single_compression_fn(b, platform);
- }
-}
-
-#[bench]
-#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
-fn bench_single_compression_sse41(b: &mut Bencher) {
- if let Some(platform) = Platform::sse41() {
- bench_single_compression_fn(b, platform);
- }
-}
-
-#[bench]
-#[cfg(blake3_avx512_ffi)]
-fn bench_single_compression_avx512(b: &mut Bencher) {
- if let Some(platform) = Platform::avx512() {
- bench_single_compression_fn(b, platform);
- }
-}
-
-fn bench_many_chunks_fn(b: &mut Bencher, platform: Platform) {
- let degree = platform.simd_degree();
- let mut inputs = Vec::new();
- for _ in 0..degree {
- inputs.push(RandomInput::new(b, CHUNK_LEN));
- }
- b.iter(|| {
- let input_arrays: ArrayVec<[&[u8; CHUNK_LEN]; MAX_SIMD_DEGREE]> = inputs
- .iter_mut()
- .take(degree)
- .map(|i| array_ref!(i.get(), 0, CHUNK_LEN))
- .collect();
- let mut out = [0; MAX_SIMD_DEGREE * OUT_LEN];
- platform.hash_many(
- &input_arrays[..],
- &[0; 8],
- 0,
- blake3::IncrementCounter::Yes,
- 0,
- 0,
- 0,
- &mut out,
- );
- });
-}
-
-#[bench]
-#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
-fn bench_many_chunks_sse2(b: &mut Bencher) {
- if let Some(platform) = Platform::sse2() {
- bench_many_chunks_fn(b, platform);
- }
-}
-
-#[bench]
-#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
-fn bench_many_chunks_sse41(b: &mut Bencher) {
- if let Some(platform) = Platform::sse41() {
- bench_many_chunks_fn(b, platform);
- }
-}
-
-#[bench]
-#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
-fn bench_many_chunks_avx2(b: &mut Bencher) {
- if let Some(platform) = Platform::avx2() {
- bench_many_chunks_fn(b, platform);
- }
-}
-
-#[bench]
-#[cfg(blake3_avx512_ffi)]
-fn bench_many_chunks_avx512(b: &mut Bencher) {
- if let Some(platform) = Platform::avx512() {
- bench_many_chunks_fn(b, platform);
- }
-}
-
-#[bench]
-#[cfg(feature = "neon")]
-fn bench_many_chunks_neon(b: &mut Bencher) {
- if let Some(platform) = Platform::neon() {
- bench_many_chunks_fn(b, platform);
- }
-}
-
-// TODO: When we get const generics we can unify this with the chunks code.
-fn bench_many_parents_fn(b: &mut Bencher, platform: Platform) {
- let degree = platform.simd_degree();
- let mut inputs = Vec::new();
- for _ in 0..degree {
- inputs.push(RandomInput::new(b, BLOCK_LEN));
- }
- b.iter(|| {
- let input_arrays: ArrayVec<[&[u8; BLOCK_LEN]; MAX_SIMD_DEGREE]> = inputs
- .iter_mut()
- .take(degree)
- .map(|i| array_ref!(i.get(), 0, BLOCK_LEN))
- .collect();
- let mut out = [0; MAX_SIMD_DEGREE * OUT_LEN];
- platform.hash_many(
- &input_arrays[..],
- &[0; 8],
- 0,
- blake3::IncrementCounter::No,
- 0,
- 0,
- 0,
- &mut out,
- );
- });
-}
-
-#[bench]
-#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
-fn bench_many_parents_sse2(b: &mut Bencher) {
- if let Some(platform) = Platform::sse2() {
- bench_many_parents_fn(b, platform);
- }
-}
-
-#[bench]
-#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
-fn bench_many_parents_sse41(b: &mut Bencher) {
- if let Some(platform) = Platform::sse41() {
- bench_many_parents_fn(b, platform);
- }
-}
-
-#[bench]
-#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
-fn bench_many_parents_avx2(b: &mut Bencher) {
- if let Some(platform) = Platform::avx2() {
- bench_many_parents_fn(b, platform);
- }
-}
-
-#[bench]
-#[cfg(blake3_avx512_ffi)]
-fn bench_many_parents_avx512(b: &mut Bencher) {
- if let Some(platform) = Platform::avx512() {
- bench_many_parents_fn(b, platform);
- }
-}
-
-#[bench]
-#[cfg(feature = "neon")]
-fn bench_many_parents_neon(b: &mut Bencher) {
- if let Some(platform) = Platform::neon() {
- bench_many_parents_fn(b, platform);
- }
-}
-
-fn bench_atonce(b: &mut Bencher, len: usize) {
- let mut input = RandomInput::new(b, len);
- b.iter(|| blake3::hash(input.get()));
-}
-
-#[bench]
-fn bench_atonce_0001_block(b: &mut Bencher) {
- bench_atonce(b, BLOCK_LEN);
-}
-
-#[bench]
-fn bench_atonce_0001_kib(b: &mut Bencher) {
- bench_atonce(b, 1 * KIB);
-}
-
-#[bench]
-fn bench_atonce_0002_kib(b: &mut Bencher) {
- bench_atonce(b, 2 * KIB);
-}
-
-#[bench]
-fn bench_atonce_0004_kib(b: &mut Bencher) {
- bench_atonce(b, 4 * KIB);
-}
-
-#[bench]
-fn bench_atonce_0008_kib(b: &mut Bencher) {
- bench_atonce(b, 8 * KIB);
-}
-
-#[bench]
-fn bench_atonce_0016_kib(b: &mut Bencher) {
- bench_atonce(b, 16 * KIB);
-}
-
-#[bench]
-fn bench_atonce_0032_kib(b: &mut Bencher) {
- bench_atonce(b, 32 * KIB);
-}
-
-#[bench]
-fn bench_atonce_0064_kib(b: &mut Bencher) {
- bench_atonce(b, 64 * KIB);
-}
-
-#[bench]
-fn bench_atonce_0128_kib(b: &mut Bencher) {
- bench_atonce(b, 128 * KIB);
-}
-
-#[bench]
-fn bench_atonce_0256_kib(b: &mut Bencher) {
- bench_atonce(b, 256 * KIB);
-}
-
-#[bench]
-fn bench_atonce_0512_kib(b: &mut Bencher) {
- bench_atonce(b, 512 * KIB);
-}
-
-#[bench]
-fn bench_atonce_1024_kib(b: &mut Bencher) {
- bench_atonce(b, 1024 * KIB);
-}
-
-fn bench_incremental(b: &mut Bencher, len: usize) {
- let mut input = RandomInput::new(b, len);
- b.iter(|| blake3::Hasher::new().update(input.get()).finalize());
-}
-
-#[bench]
-fn bench_incremental_0001_block(b: &mut Bencher) {
- bench_incremental(b, BLOCK_LEN);
-}
-
-#[bench]
-fn bench_incremental_0001_kib(b: &mut Bencher) {
- bench_incremental(b, 1 * KIB);
-}
-
-#[bench]
-fn bench_incremental_0002_kib(b: &mut Bencher) {
- bench_incremental(b, 2 * KIB);
-}
-
-#[bench]
-fn bench_incremental_0004_kib(b: &mut Bencher) {
- bench_incremental(b, 4 * KIB);
-}
-
-#[bench]
-fn bench_incremental_0008_kib(b: &mut Bencher) {
- bench_incremental(b, 8 * KIB);
-}
-
-#[bench]
-fn bench_incremental_0016_kib(b: &mut Bencher) {
- bench_incremental(b, 16 * KIB);
-}
-
-#[bench]
-fn bench_incremental_0032_kib(b: &mut Bencher) {
- bench_incremental(b, 32 * KIB);
-}
-
-#[bench]
-fn bench_incremental_0064_kib(b: &mut Bencher) {
- bench_incremental(b, 64 * KIB);
-}
-
-#[bench]
-fn bench_incremental_0128_kib(b: &mut Bencher) {
- bench_incremental(b, 128 * KIB);
-}
-
-#[bench]
-fn bench_incremental_0256_kib(b: &mut Bencher) {
- bench_incremental(b, 256 * KIB);
-}
-
-#[bench]
-fn bench_incremental_0512_kib(b: &mut Bencher) {
- bench_incremental(b, 512 * KIB);
-}
-
-#[bench]
-fn bench_incremental_1024_kib(b: &mut Bencher) {
- bench_incremental(b, 1024 * KIB);
-}
-
-fn bench_reference(b: &mut Bencher, len: usize) {
- let mut input = RandomInput::new(b, len);
- b.iter(|| {
- let mut hasher = reference_impl::Hasher::new();
- hasher.update(input.get());
- let mut out = [0; 32];
- hasher.finalize(&mut out);
- out
- });
-}
-
-#[bench]
-fn bench_reference_0001_block(b: &mut Bencher) {
- bench_reference(b, BLOCK_LEN);
-}
-
-#[bench]
-fn bench_reference_0001_kib(b: &mut Bencher) {
- bench_reference(b, 1 * KIB);
-}
-
-#[bench]
-fn bench_reference_0002_kib(b: &mut Bencher) {
- bench_reference(b, 2 * KIB);
-}
-
-#[bench]
-fn bench_reference_0004_kib(b: &mut Bencher) {
- bench_reference(b, 4 * KIB);
-}
-
-#[bench]
-fn bench_reference_0008_kib(b: &mut Bencher) {
- bench_reference(b, 8 * KIB);
-}
-
-#[bench]
-fn bench_reference_0016_kib(b: &mut Bencher) {
- bench_reference(b, 16 * KIB);
-}
-
-#[bench]
-fn bench_reference_0032_kib(b: &mut Bencher) {
- bench_reference(b, 32 * KIB);
-}
-
-#[bench]
-fn bench_reference_0064_kib(b: &mut Bencher) {
- bench_reference(b, 64 * KIB);
-}
-
-#[bench]
-fn bench_reference_0128_kib(b: &mut Bencher) {
- bench_reference(b, 128 * KIB);
-}
-
-#[bench]
-fn bench_reference_0256_kib(b: &mut Bencher) {
- bench_reference(b, 256 * KIB);
-}
-
-#[bench]
-fn bench_reference_0512_kib(b: &mut Bencher) {
- bench_reference(b, 512 * KIB);
-}
-
-#[bench]
-fn bench_reference_1024_kib(b: &mut Bencher) {
- bench_reference(b, 1024 * KIB);
-}
-
-#[cfg(feature = "rayon")]
-fn bench_rayon(b: &mut Bencher, len: usize) {
- let mut input = RandomInput::new(b, len);
- b.iter(|| {
- blake3::Hasher::new()
- .update_with_join::<blake3::join::RayonJoin>(input.get())
- .finalize()
- });
-}
-
-#[bench]
-#[cfg(feature = "rayon")]
-fn bench_rayon_0001_block(b: &mut Bencher) {
- bench_rayon(b, BLOCK_LEN);
-}
-
-#[bench]
-#[cfg(feature = "rayon")]
-fn bench_rayon_0001_kib(b: &mut Bencher) {
- bench_rayon(b, 1 * KIB);
-}
-
-#[bench]
-#[cfg(feature = "rayon")]
-fn bench_rayon_0002_kib(b: &mut Bencher) {
- bench_rayon(b, 2 * KIB);
-}
-
-#[bench]
-#[cfg(feature = "rayon")]
-fn bench_rayon_0004_kib(b: &mut Bencher) {
- bench_rayon(b, 4 * KIB);
-}
-
-#[bench]
-#[cfg(feature = "rayon")]
-fn bench_rayon_0008_kib(b: &mut Bencher) {
- bench_rayon(b, 8 * KIB);
-}
-
-#[bench]
-#[cfg(feature = "rayon")]
-fn bench_rayon_0016_kib(b: &mut Bencher) {
- bench_rayon(b, 16 * KIB);
-}
-
-#[bench]
-#[cfg(feature = "rayon")]
-fn bench_rayon_0032_kib(b: &mut Bencher) {
- bench_rayon(b, 32 * KIB);
-}
-
-#[bench]
-#[cfg(feature = "rayon")]
-fn bench_rayon_0064_kib(b: &mut Bencher) {
- bench_rayon(b, 64 * KIB);
-}
-
-#[bench]
-#[cfg(feature = "rayon")]
-fn bench_rayon_0128_kib(b: &mut Bencher) {
- bench_rayon(b, 128 * KIB);
-}
-
-#[bench]
-#[cfg(feature = "rayon")]
-fn bench_rayon_0256_kib(b: &mut Bencher) {
- bench_rayon(b, 256 * KIB);
-}
-
-#[bench]
-#[cfg(feature = "rayon")]
-fn bench_rayon_0512_kib(b: &mut Bencher) {
- bench_rayon(b, 512 * KIB);
-}
-
-#[bench]
-#[cfg(feature = "rayon")]
-fn bench_rayon_1024_kib(b: &mut Bencher) {
- bench_rayon(b, 1024 * KIB);
-}
-
-// This checks that update() splits up its input in increasing powers of 2, so
-// that it can recover a high degree of parallelism when the number of bytes
-// hashed so far is uneven. The performance of this benchmark should be
-// reasonably close to bench_incremental_0064_kib, within 80% or so. When we
-// had a bug in this logic (https://github.com/BLAKE3-team/BLAKE3/issues/69),
-// performance was less than half.
-#[bench]
-fn bench_two_updates(b: &mut Bencher) {
- let len = 65536;
- let mut input = RandomInput::new(b, len);
- b.iter(|| {
- let mut hasher = blake3::Hasher::new();
- let input = input.get();
- hasher.update(&input[..1]);
- hasher.update(&input[1..]);
- hasher.finalize()
- });
-}