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