bench.h raw

   1  // Copyright (c) 2015-present 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  #ifndef BITCOIN_BENCH_BENCH_H
   6  #define BITCOIN_BENCH_BENCH_H
   7  
   8  #include <bench/nanobench.h> // IWYU pragma: export
   9  #include <util/fs.h>
  10  #include <util/macros.h>
  11  #include <util/time.h>
  12  
  13  #include <functional>
  14  #include <map>
  15  #include <string>
  16  #include <string_view>
  17  #include <vector>
  18  
  19  /*
  20   * Usage:
  21  
  22  static void NameOfYourBenchmarkFunction(benchmark::Bench& bench)
  23  {
  24      ...do any setup needed...
  25  
  26      bench.run([&] {
  27           ...do stuff you want to time; refer to src/bench/nanobench.h
  28              for more information and the options that can be passed here...
  29      });
  30  
  31      ...do any cleanup needed...
  32  }
  33  
  34  BENCHMARK(NameOfYourBenchmarkFunction);
  35  
  36   */
  37  
  38  namespace benchmark {
  39  
  40  using ankerl::nanobench::Bench;
  41  
  42  using BenchFunction = std::function<void(Bench&)>;
  43  
  44  struct Args {
  45      bool is_list_only;
  46      bool sanity_check;
  47      std::chrono::milliseconds min_time;
  48      std::vector<double> asymptote;
  49      fs::path output_csv;
  50      fs::path output_json;
  51      std::string regex_filter;
  52      std::vector<std::string> setup_args;
  53  };
  54  
  55  class BenchRunner
  56  {
  57      // maps from "name" -> function
  58      using BenchmarkMap = std::map<std::string, BenchFunction>;
  59      static BenchmarkMap& benchmarks();
  60  
  61  public:
  62      BenchRunner(std::string_view name, BenchFunction func);
  63  
  64      static void RunAll(const Args& args);
  65  };
  66  } // namespace benchmark
  67  
  68  // BENCHMARK(foo); expands to:  benchmark::BenchRunner bench_runner_foo{"foo", foo};
  69  #define BENCHMARK(n) \
  70      benchmark::BenchRunner PASTE2(bench_runner_, n) { STRINGIZE(n), n }
  71  
  72  #endif // BITCOIN_BENCH_BENCH_H
  73