32#define NUM_ITERATIONS_BENCHMARK 10000
36#define BENCHMARK(name, pretty_name) \
37 void name([[maybe_unused]] const std::string &benchmark_name); \
38 static struct name##_register \
42 valfuzz::add_benchmark(pretty_name, name); \
44 } name##_register_instance; \
45 void name([[maybe_unused]] const std::string &benchmark_name)
47#define RUN_BENCHMARK(input_size, ...) \
49 std::cout << std::flush; \
50 std::chrono::duration<double> total = \
51 std::chrono::duration<double>::zero(); \
54 const int N_ITER = valfuzz::get_num_iterations_benchmark(); \
55 double *times = new double[N_ITER]; \
59 for (int i = 0; i < N_ITER; i++) \
61 auto start = std::chrono::high_resolution_clock::now(); \
63 auto end = std::chrono::high_resolution_clock::now(); \
64 std::chrono::duration<double> elapsed = end - start; \
66 double e = elapsed.count(); \
69 double delta = e - mean; \
70 mean += delta / (i + 1); \
71 M2 += (e - mean) * delta; \
73 double variance = M2 / N_ITER; \
74 std::sort(times, times + N_ITER); \
75 struct valfuzz::report rep = { \
77 (long unsigned int) input_size, \
78 times[N_ITER > 1 ? 1 : 0], \
79 times[N_ITER > 1 ? N_ITER - 2 : N_ITER - 1], \
81 total.count() / N_ITER, \
82 std::sqrt(variance), \
84 times[3 * N_ITER / 4], \
86 std::lock_guard<std::mutex> lock(valfuzz::get_stream_mutex()); \
88 << valfuzz::reporter_eg.report(&rep, valfuzz::get_reporter()).str() \
90 if (valfuzz::get_save_to_file()) \
92 valfuzz::get_save_file() \
93 << valfuzz::reporter_eg.report(&rep, valfuzz::get_reporter()).str() \
112void set_save_file(
const std::filesystem::path &save_to_file_path);
int & get_num_iterations_benchmark()
bool & get_do_benchmarks()
void set_save_file(const std::filesystem::path &save_to_file_path)
void set_num_iterations_benchmark(int num_iterations_benchmark)
bool & get_run_one_benchmark()
void set_save_to_file(bool save_to_file)
std::pair< std::string, benchmark_function > benchmark_pair
void set_one_benchmark(const std::string &one_benchmark)
std::ofstream & get_save_file()
void set_do_benchmarks(bool do_benchmarks)
void add_benchmark(const std::string &name, benchmark_function benchmark)
unsigned long get_num_benchmarks()
std::atomic< bool > & get_save_to_file()
std::string & get_one_benchmark()
unsigned long get_cache_l3_size()
std::function< void(std::string)> benchmark_function
std::deque< benchmark_pair > & get_benchmarks()
void set_run_one_benchmark(bool run_one_benchmark)