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)