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