16 std::cout <<
"# Benchmark, evals, iterations, total, min, max, median" << std::endl;
22 std::sort(results.begin(), results.end());
24 double total = state.
m_num_iters * std::accumulate(results.begin(), results.end(), 0.0);
30 if (!results.empty()) {
31 front = results.front();
32 back = results.back();
34 size_t mid = results.size() / 2;
35 median = results[mid];
36 if (0 == results.size() % 2) {
37 median = (results[mid] + results[mid + 1]) / 2;
41 std::cout << std::setprecision(6);
42 std::cout << state.
m_name <<
", " << state.
m_num_evals <<
", " << state.
m_num_iters <<
", " << total <<
", " << front <<
", " << back <<
", " << median << std::endl;
47 : m_plotly_url(plotly_url), m_width(width), m_height(height)
53 std::cout <<
"<html><head>" 54 <<
"<script src=\"" << m_plotly_url <<
"\"></script>" 55 <<
"</head><body><div id=\"myDiv\" style=\"width:" << m_width <<
"px; height:" << m_height <<
"px\"></div>" 56 <<
"<script> var data = [" 62 std::cout <<
"{ " << std::endl
63 <<
" name: '" << state.
m_name <<
"', " << std::endl
68 std::cout <<
prefix << std::setprecision(6) << e;
71 std::cout <<
"]," << std::endl
72 <<
" boxpoints: 'all', jitter: 0.3, pointpos: 0, type: 'box'," 79 std::cout <<
"]; var layout = { showlegend: false, yaxis: { rangemode: 'tozero', autorange: true } };" 80 <<
"Plotly.newPlot('myDiv', data, layout);" 81 <<
"</script></body></html>";
87 static std::map<std::string, Bench> benchmarks_map;
88 return benchmarks_map;
93 benchmarks().insert(std::make_pair(
name,
Bench{func, num_iters_for_one_second}));
98 if (!std::ratio_less_equal<benchmark::clock::period, std::micro>::value) {
99 std::cerr <<
"WARNING: Clock precision is worse than microsecond - benchmarks may be less accurate!\n";
102 std::cerr <<
"WARNING: This is a debug build - may result in slower benchmarks.\n";
105 std::regex reFilter(
filter);
106 std::smatch baseMatch;
110 for (
const auto& p : benchmarks()) {
111 if (!std::regex_match(p.first, baseMatch, reFilter)) {
115 uint64_t num_iters =
static_cast<uint64_t
>(p.second.num_iters_for_one_second * scaling);
116 if (0 == num_iters) {
119 State state(p.first, num_evals, num_iters, printer);
121 p.second.func(state);
132 std::chrono::duration<double> diff = current_time - m_start_time;
133 m_elapsed_results.push_back(diff.count() / m_num_iters);
135 if (m_elapsed_results.size() == m_num_evals) {
140 m_num_iters_left = m_num_iters - 1;
void result(const State &state) override
BenchRunner(std::string name, BenchFunction func, uint64_t num_iters_for_one_second)
const uint64_t m_num_iters
void result(const State &state) override
std::vector< double > m_elapsed_results
virtual void result(const State &state)=0
bool UpdateTimer(time_point finish_time)
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)
clock::time_point time_point
static BenchmarkMap & benchmarks()
PlotlyPrinter(std::string plotly_url, int64_t width, int64_t height)