/ src / bench / random.cpp
random.cpp
  1  // Copyright (c) The Bitcoin Core developers
  2  // Distributed under the MIT software license, see the accompanying
  3  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
  4  
  5  #include <bench/bench.h>
  6  #include <random.h>
  7  
  8  #include <algorithm>
  9  #include <cstdint>
 10  #include <iterator>
 11  #include <numeric>
 12  
 13  namespace {
 14  
 15  template<typename RNG>
 16  void BenchRandom_rand64(benchmark::Bench& bench, RNG&& rng) noexcept
 17  {
 18      bench.batch(1).unit("number").run([&] {
 19          rng.rand64();
 20      });
 21  }
 22  
 23  template<typename RNG>
 24  void BenchRandom_rand32(benchmark::Bench& bench, RNG&& rng) noexcept
 25  {
 26      bench.batch(1).unit("number").run([&] {
 27          rng.rand32();
 28      });
 29  }
 30  
 31  template<typename RNG>
 32  void BenchRandom_randbool(benchmark::Bench& bench, RNG&& rng) noexcept
 33  {
 34      bench.batch(1).unit("number").run([&] {
 35          rng.randbool();
 36      });
 37  }
 38  
 39  template<typename RNG>
 40  void BenchRandom_randbits(benchmark::Bench& bench, RNG&& rng) noexcept
 41  {
 42      bench.batch(64).unit("number").run([&] {
 43          for (int i = 1; i <= 64; ++i) {
 44              rng.randbits(i);
 45          }
 46      });
 47  }
 48  
 49  template<int RANGE, typename RNG>
 50  void BenchRandom_randrange(benchmark::Bench& bench, RNG&& rng) noexcept
 51  {
 52      bench.batch(RANGE).unit("number").run([&] {
 53          for (int i = 1; i <= RANGE; ++i) {
 54              rng.randrange(i);
 55          }
 56      });
 57  }
 58  
 59  template<int RANGE, typename RNG>
 60  void BenchRandom_stdshuffle(benchmark::Bench& bench, RNG&& rng) noexcept
 61  {
 62      uint64_t data[RANGE];
 63      std::iota(std::begin(data), std::end(data), uint64_t(0));
 64      bench.batch(RANGE).unit("number").run([&] {
 65          std::shuffle(std::begin(data), std::end(data), rng);
 66      });
 67  }
 68  
 69  void FastRandom_rand64(benchmark::Bench& bench) { BenchRandom_rand64(bench, FastRandomContext(true)); }
 70  void FastRandom_rand32(benchmark::Bench& bench) { BenchRandom_rand32(bench, FastRandomContext(true)); }
 71  void FastRandom_randbool(benchmark::Bench& bench) { BenchRandom_randbool(bench, FastRandomContext(true)); }
 72  void FastRandom_randbits(benchmark::Bench& bench) { BenchRandom_randbits(bench, FastRandomContext(true)); }
 73  void FastRandom_randrange100(benchmark::Bench& bench) { BenchRandom_randrange<100>(bench, FastRandomContext(true)); }
 74  void FastRandom_randrange1000(benchmark::Bench& bench) { BenchRandom_randrange<1000>(bench, FastRandomContext(true)); }
 75  void FastRandom_randrange1000000(benchmark::Bench& bench) { BenchRandom_randrange<1000000>(bench, FastRandomContext(true)); }
 76  void FastRandom_stdshuffle100(benchmark::Bench& bench) { BenchRandom_stdshuffle<100>(bench, FastRandomContext(true)); }
 77  
 78  void InsecureRandom_rand64(benchmark::Bench& bench) { BenchRandom_rand64(bench, InsecureRandomContext(251438)); }
 79  void InsecureRandom_rand32(benchmark::Bench& bench) { BenchRandom_rand32(bench, InsecureRandomContext(251438)); }
 80  void InsecureRandom_randbool(benchmark::Bench& bench) { BenchRandom_randbool(bench, InsecureRandomContext(251438)); }
 81  void InsecureRandom_randbits(benchmark::Bench& bench) { BenchRandom_randbits(bench, InsecureRandomContext(251438)); }
 82  void InsecureRandom_randrange100(benchmark::Bench& bench) { BenchRandom_randrange<100>(bench, InsecureRandomContext(251438)); }
 83  void InsecureRandom_randrange1000(benchmark::Bench& bench) { BenchRandom_randrange<1000>(bench, InsecureRandomContext(251438)); }
 84  void InsecureRandom_randrange1000000(benchmark::Bench& bench) { BenchRandom_randrange<1000000>(bench, InsecureRandomContext(251438)); }
 85  void InsecureRandom_stdshuffle100(benchmark::Bench& bench) { BenchRandom_stdshuffle<100>(bench, InsecureRandomContext(251438)); }
 86  
 87  } // namespace
 88  
 89  BENCHMARK(FastRandom_rand64);
 90  BENCHMARK(FastRandom_rand32);
 91  BENCHMARK(FastRandom_randbool);
 92  BENCHMARK(FastRandom_randbits);
 93  BENCHMARK(FastRandom_randrange100);
 94  BENCHMARK(FastRandom_randrange1000);
 95  BENCHMARK(FastRandom_randrange1000000);
 96  BENCHMARK(FastRandom_stdshuffle100);
 97  
 98  BENCHMARK(InsecureRandom_rand64);
 99  BENCHMARK(InsecureRandom_rand32);
100  BENCHMARK(InsecureRandom_randbool);
101  BENCHMARK(InsecureRandom_randbits);
102  BENCHMARK(InsecureRandom_randrange100);
103  BENCHMARK(InsecureRandom_randrange1000);
104  BENCHMARK(InsecureRandom_randrange1000000);
105  BENCHMARK(InsecureRandom_stdshuffle100);