xref: /aosp_15_r20/external/google-benchmark/src/benchmark_runner.h (revision dbb99499c3810fa1611fa2242a2fc446be01a57c)
1*dbb99499SAndroid Build Coastguard Worker // Copyright 2015 Google Inc. All rights reserved.
2*dbb99499SAndroid Build Coastguard Worker //
3*dbb99499SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*dbb99499SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*dbb99499SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*dbb99499SAndroid Build Coastguard Worker //
7*dbb99499SAndroid Build Coastguard Worker //     http://www.apache.org/licenses/LICENSE-2.0
8*dbb99499SAndroid Build Coastguard Worker //
9*dbb99499SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*dbb99499SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*dbb99499SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*dbb99499SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*dbb99499SAndroid Build Coastguard Worker // limitations under the License.
14*dbb99499SAndroid Build Coastguard Worker 
15*dbb99499SAndroid Build Coastguard Worker #ifndef BENCHMARK_RUNNER_H_
16*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_RUNNER_H_
17*dbb99499SAndroid Build Coastguard Worker 
18*dbb99499SAndroid Build Coastguard Worker #include <thread>
19*dbb99499SAndroid Build Coastguard Worker #include <vector>
20*dbb99499SAndroid Build Coastguard Worker 
21*dbb99499SAndroid Build Coastguard Worker #include "benchmark_api_internal.h"
22*dbb99499SAndroid Build Coastguard Worker #include "internal_macros.h"
23*dbb99499SAndroid Build Coastguard Worker #include "perf_counters.h"
24*dbb99499SAndroid Build Coastguard Worker #include "thread_manager.h"
25*dbb99499SAndroid Build Coastguard Worker 
26*dbb99499SAndroid Build Coastguard Worker namespace benchmark {
27*dbb99499SAndroid Build Coastguard Worker 
28*dbb99499SAndroid Build Coastguard Worker BM_DECLARE_string(benchmark_min_time);
29*dbb99499SAndroid Build Coastguard Worker BM_DECLARE_double(benchmark_min_warmup_time);
30*dbb99499SAndroid Build Coastguard Worker BM_DECLARE_int32(benchmark_repetitions);
31*dbb99499SAndroid Build Coastguard Worker BM_DECLARE_bool(benchmark_report_aggregates_only);
32*dbb99499SAndroid Build Coastguard Worker BM_DECLARE_bool(benchmark_display_aggregates_only);
33*dbb99499SAndroid Build Coastguard Worker BM_DECLARE_string(benchmark_perf_counters);
34*dbb99499SAndroid Build Coastguard Worker 
35*dbb99499SAndroid Build Coastguard Worker namespace internal {
36*dbb99499SAndroid Build Coastguard Worker 
37*dbb99499SAndroid Build Coastguard Worker extern MemoryManager* memory_manager;
38*dbb99499SAndroid Build Coastguard Worker extern ProfilerManager* profiler_manager;
39*dbb99499SAndroid Build Coastguard Worker 
40*dbb99499SAndroid Build Coastguard Worker struct RunResults {
41*dbb99499SAndroid Build Coastguard Worker   std::vector<BenchmarkReporter::Run> non_aggregates;
42*dbb99499SAndroid Build Coastguard Worker   std::vector<BenchmarkReporter::Run> aggregates_only;
43*dbb99499SAndroid Build Coastguard Worker 
44*dbb99499SAndroid Build Coastguard Worker   bool display_report_aggregates_only = false;
45*dbb99499SAndroid Build Coastguard Worker   bool file_report_aggregates_only = false;
46*dbb99499SAndroid Build Coastguard Worker };
47*dbb99499SAndroid Build Coastguard Worker 
48*dbb99499SAndroid Build Coastguard Worker struct BENCHMARK_EXPORT BenchTimeType {
49*dbb99499SAndroid Build Coastguard Worker   enum { ITERS, TIME } tag;
50*dbb99499SAndroid Build Coastguard Worker   union {
51*dbb99499SAndroid Build Coastguard Worker     IterationCount iters;
52*dbb99499SAndroid Build Coastguard Worker     double time;
53*dbb99499SAndroid Build Coastguard Worker   };
54*dbb99499SAndroid Build Coastguard Worker };
55*dbb99499SAndroid Build Coastguard Worker 
56*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT
57*dbb99499SAndroid Build Coastguard Worker BenchTimeType ParseBenchMinTime(const std::string& value);
58*dbb99499SAndroid Build Coastguard Worker 
59*dbb99499SAndroid Build Coastguard Worker class BenchmarkRunner {
60*dbb99499SAndroid Build Coastguard Worker  public:
61*dbb99499SAndroid Build Coastguard Worker   BenchmarkRunner(const benchmark::internal::BenchmarkInstance& b_,
62*dbb99499SAndroid Build Coastguard Worker                   benchmark::internal::PerfCountersMeasurement* pmc_,
63*dbb99499SAndroid Build Coastguard Worker                   BenchmarkReporter::PerFamilyRunReports* reports_for_family);
64*dbb99499SAndroid Build Coastguard Worker 
GetNumRepeats()65*dbb99499SAndroid Build Coastguard Worker   int GetNumRepeats() const { return repeats; }
66*dbb99499SAndroid Build Coastguard Worker 
HasRepeatsRemaining()67*dbb99499SAndroid Build Coastguard Worker   bool HasRepeatsRemaining() const {
68*dbb99499SAndroid Build Coastguard Worker     return GetNumRepeats() != num_repetitions_done;
69*dbb99499SAndroid Build Coastguard Worker   }
70*dbb99499SAndroid Build Coastguard Worker 
71*dbb99499SAndroid Build Coastguard Worker   void DoOneRepetition();
72*dbb99499SAndroid Build Coastguard Worker 
73*dbb99499SAndroid Build Coastguard Worker   RunResults&& GetResults();
74*dbb99499SAndroid Build Coastguard Worker 
GetReportsForFamily()75*dbb99499SAndroid Build Coastguard Worker   BenchmarkReporter::PerFamilyRunReports* GetReportsForFamily() const {
76*dbb99499SAndroid Build Coastguard Worker     return reports_for_family;
77*dbb99499SAndroid Build Coastguard Worker   }
78*dbb99499SAndroid Build Coastguard Worker 
GetMinTime()79*dbb99499SAndroid Build Coastguard Worker   double GetMinTime() const { return min_time; }
80*dbb99499SAndroid Build Coastguard Worker 
HasExplicitIters()81*dbb99499SAndroid Build Coastguard Worker   bool HasExplicitIters() const { return has_explicit_iteration_count; }
82*dbb99499SAndroid Build Coastguard Worker 
GetIters()83*dbb99499SAndroid Build Coastguard Worker   IterationCount GetIters() const { return iters; }
84*dbb99499SAndroid Build Coastguard Worker 
85*dbb99499SAndroid Build Coastguard Worker  private:
86*dbb99499SAndroid Build Coastguard Worker   RunResults run_results;
87*dbb99499SAndroid Build Coastguard Worker 
88*dbb99499SAndroid Build Coastguard Worker   const benchmark::internal::BenchmarkInstance& b;
89*dbb99499SAndroid Build Coastguard Worker   BenchmarkReporter::PerFamilyRunReports* reports_for_family;
90*dbb99499SAndroid Build Coastguard Worker 
91*dbb99499SAndroid Build Coastguard Worker   BenchTimeType parsed_benchtime_flag;
92*dbb99499SAndroid Build Coastguard Worker   const double min_time;
93*dbb99499SAndroid Build Coastguard Worker   const double min_warmup_time;
94*dbb99499SAndroid Build Coastguard Worker   bool warmup_done;
95*dbb99499SAndroid Build Coastguard Worker   const int repeats;
96*dbb99499SAndroid Build Coastguard Worker   const bool has_explicit_iteration_count;
97*dbb99499SAndroid Build Coastguard Worker 
98*dbb99499SAndroid Build Coastguard Worker   int num_repetitions_done = 0;
99*dbb99499SAndroid Build Coastguard Worker 
100*dbb99499SAndroid Build Coastguard Worker   std::vector<std::thread> pool;
101*dbb99499SAndroid Build Coastguard Worker 
102*dbb99499SAndroid Build Coastguard Worker   std::vector<MemoryManager::Result> memory_results;
103*dbb99499SAndroid Build Coastguard Worker 
104*dbb99499SAndroid Build Coastguard Worker   IterationCount iters;  // preserved between repetitions!
105*dbb99499SAndroid Build Coastguard Worker   // So only the first repetition has to find/calculate it,
106*dbb99499SAndroid Build Coastguard Worker   // the other repetitions will just use that precomputed iteration count.
107*dbb99499SAndroid Build Coastguard Worker 
108*dbb99499SAndroid Build Coastguard Worker   PerfCountersMeasurement* const perf_counters_measurement_ptr = nullptr;
109*dbb99499SAndroid Build Coastguard Worker 
110*dbb99499SAndroid Build Coastguard Worker   struct IterationResults {
111*dbb99499SAndroid Build Coastguard Worker     internal::ThreadManager::Result results;
112*dbb99499SAndroid Build Coastguard Worker     IterationCount iters;
113*dbb99499SAndroid Build Coastguard Worker     double seconds;
114*dbb99499SAndroid Build Coastguard Worker   };
115*dbb99499SAndroid Build Coastguard Worker   IterationResults DoNIterations();
116*dbb99499SAndroid Build Coastguard Worker 
117*dbb99499SAndroid Build Coastguard Worker   MemoryManager::Result* RunMemoryManager(IterationCount memory_iterations);
118*dbb99499SAndroid Build Coastguard Worker 
119*dbb99499SAndroid Build Coastguard Worker   void RunProfilerManager();
120*dbb99499SAndroid Build Coastguard Worker 
121*dbb99499SAndroid Build Coastguard Worker   IterationCount PredictNumItersNeeded(const IterationResults& i) const;
122*dbb99499SAndroid Build Coastguard Worker 
123*dbb99499SAndroid Build Coastguard Worker   bool ShouldReportIterationResults(const IterationResults& i) const;
124*dbb99499SAndroid Build Coastguard Worker 
125*dbb99499SAndroid Build Coastguard Worker   double GetMinTimeToApply() const;
126*dbb99499SAndroid Build Coastguard Worker 
127*dbb99499SAndroid Build Coastguard Worker   void FinishWarmUp(const IterationCount& i);
128*dbb99499SAndroid Build Coastguard Worker 
129*dbb99499SAndroid Build Coastguard Worker   void RunWarmUp();
130*dbb99499SAndroid Build Coastguard Worker };
131*dbb99499SAndroid Build Coastguard Worker 
132*dbb99499SAndroid Build Coastguard Worker }  // namespace internal
133*dbb99499SAndroid Build Coastguard Worker 
134*dbb99499SAndroid Build Coastguard Worker }  // end namespace benchmark
135*dbb99499SAndroid Build Coastguard Worker 
136*dbb99499SAndroid Build Coastguard Worker #endif  // BENCHMARK_RUNNER_H_
137