bench.h
1 // Copyright (c) 2015-2022 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 12 #include <chrono> 13 #include <cstdint> 14 #include <functional> 15 #include <map> 16 #include <string> 17 #include <utility> 18 #include <vector> 19 20 /* 21 * Usage: 22 23 static void NameOfYourBenchmarkFunction(benchmark::Bench& bench) 24 { 25 ...do any setup needed... 26 27 bench.run([&] { 28 ...do stuff you want to time; refer to src/bench/nanobench.h 29 for more information and the options that can be passed here... 30 }); 31 32 ...do any cleanup needed... 33 } 34 35 BENCHMARK(NameOfYourBenchmarkFunction); 36 37 */ 38 39 namespace benchmark { 40 41 using ankerl::nanobench::Bench; 42 43 typedef std::function<void(Bench&)> BenchFunction; 44 45 enum PriorityLevel : uint8_t 46 { 47 LOW = 1 << 0, 48 HIGH = 1 << 2, 49 }; 50 51 // List priority labels, comma-separated and sorted by increasing priority 52 std::string ListPriorities(); 53 uint8_t StringToPriority(const std::string& str); 54 55 struct Args { 56 bool is_list_only; 57 bool sanity_check; 58 std::chrono::milliseconds min_time; 59 std::vector<double> asymptote; 60 fs::path output_csv; 61 fs::path output_json; 62 std::string regex_filter; 63 uint8_t priority; 64 std::vector<std::string> setup_args; 65 }; 66 67 class BenchRunner 68 { 69 // maps from "name" -> (function, priority_level) 70 typedef std::map<std::string, std::pair<BenchFunction, PriorityLevel>> BenchmarkMap; 71 static BenchmarkMap& benchmarks(); 72 73 public: 74 BenchRunner(std::string name, BenchFunction func, PriorityLevel level); 75 76 static void RunAll(const Args& args); 77 }; 78 } // namespace benchmark 79 80 // BENCHMARK(foo) expands to: benchmark::BenchRunner bench_11foo("foo", foo, priority_level); 81 #define BENCHMARK(n, priority_level) \ 82 benchmark::BenchRunner PASTE2(bench_, PASTE2(__LINE__, n))(STRINGIZE(n), n, priority_level); 83 84 #endif // BITCOIN_BENCH_BENCH_H