xref: /llvm-project/third-party/benchmark/src/benchmark_api_internal.cc (revision a5b797172cc902db166e9a695716fb81405f86e4)
15dda2efdSMircea Trofin #include "benchmark_api_internal.h"
25dda2efdSMircea Trofin 
35dda2efdSMircea Trofin #include <cinttypes>
45dda2efdSMircea Trofin 
55dda2efdSMircea Trofin #include "string_util.h"
65dda2efdSMircea Trofin 
75dda2efdSMircea Trofin namespace benchmark {
85dda2efdSMircea Trofin namespace internal {
95dda2efdSMircea Trofin 
BenchmarkInstance(Benchmark * benchmark,int family_idx,int per_family_instance_idx,const std::vector<int64_t> & args,int thread_count)105dda2efdSMircea Trofin BenchmarkInstance::BenchmarkInstance(Benchmark* benchmark, int family_idx,
115dda2efdSMircea Trofin                                      int per_family_instance_idx,
125dda2efdSMircea Trofin                                      const std::vector<int64_t>& args,
135dda2efdSMircea Trofin                                      int thread_count)
145dda2efdSMircea Trofin     : benchmark_(*benchmark),
155dda2efdSMircea Trofin       family_index_(family_idx),
165dda2efdSMircea Trofin       per_family_instance_index_(per_family_instance_idx),
175dda2efdSMircea Trofin       aggregation_report_mode_(benchmark_.aggregation_report_mode_),
185dda2efdSMircea Trofin       args_(args),
19*a5b79717SMircea Trofin       time_unit_(benchmark_.GetTimeUnit()),
205dda2efdSMircea Trofin       measure_process_cpu_time_(benchmark_.measure_process_cpu_time_),
215dda2efdSMircea Trofin       use_real_time_(benchmark_.use_real_time_),
225dda2efdSMircea Trofin       use_manual_time_(benchmark_.use_manual_time_),
235dda2efdSMircea Trofin       complexity_(benchmark_.complexity_),
245dda2efdSMircea Trofin       complexity_lambda_(benchmark_.complexity_lambda_),
255dda2efdSMircea Trofin       statistics_(benchmark_.statistics_),
265dda2efdSMircea Trofin       repetitions_(benchmark_.repetitions_),
275dda2efdSMircea Trofin       min_time_(benchmark_.min_time_),
28*a5b79717SMircea Trofin       min_warmup_time_(benchmark_.min_warmup_time_),
295dda2efdSMircea Trofin       iterations_(benchmark_.iterations_),
305dda2efdSMircea Trofin       threads_(thread_count) {
315dda2efdSMircea Trofin   name_.function_name = benchmark_.name_;
325dda2efdSMircea Trofin 
335dda2efdSMircea Trofin   size_t arg_i = 0;
345dda2efdSMircea Trofin   for (const auto& arg : args) {
355dda2efdSMircea Trofin     if (!name_.args.empty()) {
365dda2efdSMircea Trofin       name_.args += '/';
375dda2efdSMircea Trofin     }
385dda2efdSMircea Trofin 
395dda2efdSMircea Trofin     if (arg_i < benchmark->arg_names_.size()) {
405dda2efdSMircea Trofin       const auto& arg_name = benchmark_.arg_names_[arg_i];
415dda2efdSMircea Trofin       if (!arg_name.empty()) {
425dda2efdSMircea Trofin         name_.args += StrFormat("%s:", arg_name.c_str());
435dda2efdSMircea Trofin       }
445dda2efdSMircea Trofin     }
455dda2efdSMircea Trofin 
465dda2efdSMircea Trofin     name_.args += StrFormat("%" PRId64, arg);
475dda2efdSMircea Trofin     ++arg_i;
485dda2efdSMircea Trofin   }
495dda2efdSMircea Trofin 
505dda2efdSMircea Trofin   if (!IsZero(benchmark->min_time_)) {
515dda2efdSMircea Trofin     name_.min_time = StrFormat("min_time:%0.3f", benchmark_.min_time_);
525dda2efdSMircea Trofin   }
535dda2efdSMircea Trofin 
54*a5b79717SMircea Trofin   if (!IsZero(benchmark->min_warmup_time_)) {
55*a5b79717SMircea Trofin     name_.min_warmup_time =
56*a5b79717SMircea Trofin         StrFormat("min_warmup_time:%0.3f", benchmark_.min_warmup_time_);
57*a5b79717SMircea Trofin   }
58*a5b79717SMircea Trofin 
595dda2efdSMircea Trofin   if (benchmark_.iterations_ != 0) {
605dda2efdSMircea Trofin     name_.iterations = StrFormat(
615dda2efdSMircea Trofin         "iterations:%lu", static_cast<unsigned long>(benchmark_.iterations_));
625dda2efdSMircea Trofin   }
635dda2efdSMircea Trofin 
645dda2efdSMircea Trofin   if (benchmark_.repetitions_ != 0) {
655dda2efdSMircea Trofin     name_.repetitions = StrFormat("repeats:%d", benchmark_.repetitions_);
665dda2efdSMircea Trofin   }
675dda2efdSMircea Trofin 
685dda2efdSMircea Trofin   if (benchmark_.measure_process_cpu_time_) {
695dda2efdSMircea Trofin     name_.time_type = "process_time";
705dda2efdSMircea Trofin   }
715dda2efdSMircea Trofin 
725dda2efdSMircea Trofin   if (benchmark_.use_manual_time_) {
735dda2efdSMircea Trofin     if (!name_.time_type.empty()) {
745dda2efdSMircea Trofin       name_.time_type += '/';
755dda2efdSMircea Trofin     }
765dda2efdSMircea Trofin     name_.time_type += "manual_time";
775dda2efdSMircea Trofin   } else if (benchmark_.use_real_time_) {
785dda2efdSMircea Trofin     if (!name_.time_type.empty()) {
795dda2efdSMircea Trofin       name_.time_type += '/';
805dda2efdSMircea Trofin     }
815dda2efdSMircea Trofin     name_.time_type += "real_time";
825dda2efdSMircea Trofin   }
835dda2efdSMircea Trofin 
845dda2efdSMircea Trofin   if (!benchmark_.thread_counts_.empty()) {
855dda2efdSMircea Trofin     name_.threads = StrFormat("threads:%d", threads_);
865dda2efdSMircea Trofin   }
87a290770fSMircea Trofin 
88a290770fSMircea Trofin   setup_ = benchmark_.setup_;
89a290770fSMircea Trofin   teardown_ = benchmark_.teardown_;
905dda2efdSMircea Trofin }
915dda2efdSMircea Trofin 
Run(IterationCount iters,int thread_id,internal::ThreadTimer * timer,internal::ThreadManager * manager,internal::PerfCountersMeasurement * perf_counters_measurement) const925dda2efdSMircea Trofin State BenchmarkInstance::Run(
935dda2efdSMircea Trofin     IterationCount iters, int thread_id, internal::ThreadTimer* timer,
945dda2efdSMircea Trofin     internal::ThreadManager* manager,
955dda2efdSMircea Trofin     internal::PerfCountersMeasurement* perf_counters_measurement) const {
96*a5b79717SMircea Trofin   State st(name_.function_name, iters, args_, thread_id, threads_, timer,
97*a5b79717SMircea Trofin            manager, perf_counters_measurement);
985dda2efdSMircea Trofin   benchmark_.Run(st);
995dda2efdSMircea Trofin   return st;
1005dda2efdSMircea Trofin }
1015dda2efdSMircea Trofin 
Setup() const102a290770fSMircea Trofin void BenchmarkInstance::Setup() const {
103a290770fSMircea Trofin   if (setup_) {
104*a5b79717SMircea Trofin     State st(name_.function_name, /*iters*/ 1, args_, /*thread_id*/ 0, threads_,
105*a5b79717SMircea Trofin              nullptr, nullptr, nullptr);
106a290770fSMircea Trofin     setup_(st);
107a290770fSMircea Trofin   }
108a290770fSMircea Trofin }
109a290770fSMircea Trofin 
Teardown() const110a290770fSMircea Trofin void BenchmarkInstance::Teardown() const {
111a290770fSMircea Trofin   if (teardown_) {
112*a5b79717SMircea Trofin     State st(name_.function_name, /*iters*/ 1, args_, /*thread_id*/ 0, threads_,
113*a5b79717SMircea Trofin              nullptr, nullptr, nullptr);
114a290770fSMircea Trofin     teardown_(st);
115a290770fSMircea Trofin   }
116a290770fSMircea Trofin }
1175dda2efdSMircea Trofin }  // namespace internal
1185dda2efdSMircea Trofin }  // namespace benchmark
119