17 std::cout <<
"# Benchmark, evals, iterations, total, min, max, median" << std::endl;
23 std::sort(results.begin(), results.end());
25 double total = state.
m_num_iters * std::accumulate(results.begin(), results.end(), 0.0);
31 if (!results.empty()) {
32 front = results.front();
33 back = results.back();
35 size_t mid = results.size() / 2;
36 median = results[mid];
37 if (0 == results.size() % 2) {
38 median = (results[mid] + results[mid + 1]) / 2;
42 std::cout << std::setprecision(6);
43 std::cout << state.
m_name <<
", " << state.
m_num_evals <<
", " << state.
m_num_iters <<
", " << total <<
", " << front <<
", " << back <<
", " << median << std::endl;
48 : m_plotly_url(plotly_url), m_width(width), m_height(height)
54 std::cout <<
"<html><head>" 56 <<
"</head><body><div id=\"myDiv\" style=\"width:" <<
m_width <<
"px; height:" <<
m_height <<
"px\"></div>" 57 <<
"<script> var data = [" 63 std::cout <<
"{ " << std::endl
64 <<
" name: '" << state.
m_name <<
"', " << std::endl
69 std::cout << prefix << std::setprecision(6) <<
e;
72 std::cout <<
"]," << std::endl
73 <<
" boxpoints: 'all', jitter: 0.3, pointpos: 0, type: 'box'," 80 std::cout <<
"]; var layout = { showlegend: false, yaxis: { rangemode: 'tozero', autorange: true } };" 81 <<
"Plotly.newPlot('myDiv', data, layout);" 82 <<
"</script></body></html>";
88 static std::map<std::string, Bench> benchmarks_map;
89 return benchmarks_map;
94 benchmarks().insert(std::make_pair(name,
Bench{func, num_iters_for_one_second}));
100 if (!std::ratio_less_equal<benchmark::clock::period, std::micro>::value) {
101 std::cerr <<
"WARNING: Clock precision is worse than microsecond - benchmarks may be less accurate!\n";
104 std::cerr <<
"WARNING: This is a debug build - may result in slower benchmarks.\n";
107 std::regex reFilter(filter);
108 std::smatch baseMatch;
112 for (
const auto& p : benchmarks()) {
113 if (!std::regex_match(p.first, baseMatch, reFilter)) {
117 uint64_t num_iters =
static_cast<uint64_t
>(p.second.num_iters_for_one_second * scaling);
118 if (0 == num_iters) {
121 State state(p.first, num_evals, num_iters, printer);
123 p.second.func(state);
136 std::chrono::duration<double>
diff = current_time - m_start_time;
137 m_elapsed_results.push_back(diff.count() / m_num_iters);
139 if (m_elapsed_results.size() == m_num_evals) {
144 m_num_iters_left = m_num_iters - 1;
BenchRunner(std::string name, BenchFunction func, uint64_t num_iters_for_one_second)
const uint64_t m_num_iters
std::vector< double > m_elapsed_results
virtual void result(const State &state)=0
bool UpdateTimer(time_point finish_time)
void result(const State &state)
void result(const State &state)
const uint64_t m_num_evals
std::function< void(State &)> BenchFunction
std::map< std::string, Bench > BenchmarkMap
static void RunAll(Printer &printer, uint64_t num_evals, double scaling, const std::string &filter, bool is_list_only)
N diff(N const &_a, N const &_b)
clock::time_point time_point
static BenchmarkMap & benchmarks()
PlotlyPrinter(std::string plotly_url, int64_t width, int64_t height)