brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.5 KiB · 286f986 Raw
119 lines · plain
1#include "benchmark_api_internal.h"2 3#include <cinttypes>4 5#include "string_util.h"6 7namespace benchmark {8namespace internal {9 10BenchmarkInstance::BenchmarkInstance(Benchmark* benchmark, int family_idx,11                                     int per_family_instance_idx,12                                     const std::vector<int64_t>& args,13                                     int thread_count)14    : benchmark_(*benchmark),15      family_index_(family_idx),16      per_family_instance_index_(per_family_instance_idx),17      aggregation_report_mode_(benchmark_.aggregation_report_mode_),18      args_(args),19      time_unit_(benchmark_.GetTimeUnit()),20      measure_process_cpu_time_(benchmark_.measure_process_cpu_time_),21      use_real_time_(benchmark_.use_real_time_),22      use_manual_time_(benchmark_.use_manual_time_),23      complexity_(benchmark_.complexity_),24      complexity_lambda_(benchmark_.complexity_lambda_),25      statistics_(benchmark_.statistics_),26      repetitions_(benchmark_.repetitions_),27      min_time_(benchmark_.min_time_),28      min_warmup_time_(benchmark_.min_warmup_time_),29      iterations_(benchmark_.iterations_),30      threads_(thread_count) {31  name_.function_name = benchmark_.name_;32 33  size_t arg_i = 0;34  for (const auto& arg : args) {35    if (!name_.args.empty()) {36      name_.args += '/';37    }38 39    if (arg_i < benchmark->arg_names_.size()) {40      const auto& arg_name = benchmark_.arg_names_[arg_i];41      if (!arg_name.empty()) {42        name_.args += StrFormat("%s:", arg_name.c_str());43      }44    }45 46    name_.args += StrFormat("%" PRId64, arg);47    ++arg_i;48  }49 50  if (!IsZero(benchmark->min_time_)) {51    name_.min_time = StrFormat("min_time:%0.3f", benchmark_.min_time_);52  }53 54  if (!IsZero(benchmark->min_warmup_time_)) {55    name_.min_warmup_time =56        StrFormat("min_warmup_time:%0.3f", benchmark_.min_warmup_time_);57  }58 59  if (benchmark_.iterations_ != 0) {60    name_.iterations = StrFormat(61        "iterations:%lu", static_cast<unsigned long>(benchmark_.iterations_));62  }63 64  if (benchmark_.repetitions_ != 0) {65    name_.repetitions = StrFormat("repeats:%d", benchmark_.repetitions_);66  }67 68  if (benchmark_.measure_process_cpu_time_) {69    name_.time_type = "process_time";70  }71 72  if (benchmark_.use_manual_time_) {73    if (!name_.time_type.empty()) {74      name_.time_type += '/';75    }76    name_.time_type += "manual_time";77  } else if (benchmark_.use_real_time_) {78    if (!name_.time_type.empty()) {79      name_.time_type += '/';80    }81    name_.time_type += "real_time";82  }83 84  if (!benchmark_.thread_counts_.empty()) {85    name_.threads = StrFormat("threads:%d", threads_);86  }87 88  setup_ = benchmark_.setup_;89  teardown_ = benchmark_.teardown_;90}91 92State BenchmarkInstance::Run(93    IterationCount iters, int thread_id, internal::ThreadTimer* timer,94    internal::ThreadManager* manager,95    internal::PerfCountersMeasurement* perf_counters_measurement) const {96  State st(name_.function_name, iters, args_, thread_id, threads_, timer,97           manager, perf_counters_measurement);98  benchmark_.Run(st);99  return st;100}101 102void BenchmarkInstance::Setup() const {103  if (setup_) {104    State st(name_.function_name, /*iters*/ 1, args_, /*thread_id*/ 0, threads_,105             nullptr, nullptr, nullptr);106    setup_(st);107  }108}109 110void BenchmarkInstance::Teardown() const {111  if (teardown_) {112    State st(name_.function_name, /*iters*/ 1, args_, /*thread_id*/ 0, threads_,113             nullptr, nullptr, nullptr);114    teardown_(st);115  }116}117}  // namespace internal118}  // namespace benchmark119