// Copyright (c) 2016-2021 The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include #include #include #include #include #include #include #include #include #include #include /* Number of bytes to hash per iteration */ static const uint64_t BUFFER_SIZE = 1000*1000; static void RIPEMD160(benchmark::Bench& bench) { uint8_t hash[CRIPEMD160::OUTPUT_SIZE]; std::vector in(BUFFER_SIZE,0); bench.batch(in.size()).unit("byte").run([&] { CRIPEMD160().Write(in.data(), in.size()).Finalize(hash); }); } static void SHA1(benchmark::Bench& bench) { uint8_t hash[CSHA1::OUTPUT_SIZE]; std::vector in(BUFFER_SIZE,0); bench.batch(in.size()).unit("byte").run([&] { CSHA1().Write(in.data(), in.size()).Finalize(hash); }); } static void SHA256(benchmark::Bench& bench) { uint8_t hash[CSHA256::OUTPUT_SIZE]; std::vector in(BUFFER_SIZE,0); bench.batch(in.size()).unit("byte").run([&] { CSHA256().Write(in.data(), in.size()).Finalize(hash); }); } static void SHA3_256_1M(benchmark::Bench& bench) { uint8_t hash[SHA3_256::OUTPUT_SIZE]; std::vector in(BUFFER_SIZE,0); bench.batch(in.size()).unit("byte").run([&] { SHA3_256().Write(in).Finalize(hash); }); } static void SHA256_32b(benchmark::Bench& bench) { std::vector in(32,0); bench.batch(in.size()).unit("byte").run([&] { CSHA256() .Write(in.data(), in.size()) .Finalize(in.data()); }); } static void SHA256D64_1024(benchmark::Bench& bench) { std::vector in(64 * 1024, 0); bench.batch(in.size()).unit("byte").run([&] { SHA256D64(in.data(), in.data(), 1024); }); } static void SHA512(benchmark::Bench& bench) { uint8_t hash[CSHA512::OUTPUT_SIZE]; std::vector in(BUFFER_SIZE,0); bench.batch(in.size()).unit("byte").run([&] { CSHA512().Write(in.data(), in.size()).Finalize(hash); }); } static void SipHash_32b(benchmark::Bench& bench) { uint256 x; uint64_t k1 = 0; bench.run([&] { *((uint64_t*)x.begin()) = SipHashUint256(0, ++k1, x); }); } static void FastRandom_32bit(benchmark::Bench& bench) { FastRandomContext rng(true); bench.run([&] { rng.rand32(); }); } static void FastRandom_1bit(benchmark::Bench& bench) { FastRandomContext rng(true); bench.run([&] { rng.randbool(); }); } static void MuHash(benchmark::Bench& bench) { MuHash3072 acc; unsigned char key[32] = {0}; uint32_t i = 0; bench.run([&] { key[0] = ++i & 0xFF; acc *= MuHash3072(key); }); } static void MuHashMul(benchmark::Bench& bench) { MuHash3072 acc; FastRandomContext rng(true); MuHash3072 muhash{rng.randbytes(32)}; bench.run([&] { acc *= muhash; }); } static void MuHashDiv(benchmark::Bench& bench) { MuHash3072 acc; FastRandomContext rng(true); MuHash3072 muhash{rng.randbytes(32)}; bench.run([&] { acc /= muhash; }); } static void MuHashPrecompute(benchmark::Bench& bench) { MuHash3072 acc; FastRandomContext rng(true); std::vector key{rng.randbytes(32)}; bench.run([&] { MuHash3072{key}; }); } BENCHMARK(RIPEMD160, benchmark::PriorityLevel::HIGH); BENCHMARK(SHA1, benchmark::PriorityLevel::HIGH); BENCHMARK(SHA256, benchmark::PriorityLevel::HIGH); BENCHMARK(SHA512, benchmark::PriorityLevel::HIGH); BENCHMARK(SHA3_256_1M, benchmark::PriorityLevel::HIGH); BENCHMARK(SHA256_32b, benchmark::PriorityLevel::HIGH); BENCHMARK(SipHash_32b, benchmark::PriorityLevel::HIGH); BENCHMARK(SHA256D64_1024, benchmark::PriorityLevel::HIGH); BENCHMARK(FastRandom_32bit, benchmark::PriorityLevel::HIGH); BENCHMARK(FastRandom_1bit, benchmark::PriorityLevel::HIGH); BENCHMARK(MuHash, benchmark::PriorityLevel::HIGH); BENCHMARK(MuHashMul, benchmark::PriorityLevel::HIGH); BENCHMARK(MuHashDiv, benchmark::PriorityLevel::HIGH); BENCHMARK(MuHashPrecompute, benchmark::PriorityLevel::HIGH);