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