blob: 659a71440e748e03bfb31fc14e975d24579bd5fc [file] [log] [blame]
Ericd0384722016-09-05 15:48:40 -06001#ifndef BENCHMARK_API_INTERNAL_H
2#define BENCHMARK_API_INTERNAL_H
3
Ericd0384722016-09-05 15:48:40 -06004#include <cmath>
5#include <iosfwd>
Dominic Hamon332f6772016-10-07 11:35:03 -07006#include <limits>
Dominic Hamonedc77a32018-09-28 12:28:43 +01007#include <memory>
Dominic Hamon332f6772016-10-07 11:35:03 -07008#include <string>
9#include <vector>
Ericd0384722016-09-05 15:48:40 -060010
Dominic Hamon3b508fa2021-05-10 17:12:09 +010011#include "benchmark/benchmark.h"
12#include "commandlineflags.h"
13
Ericd0384722016-09-05 15:48:40 -060014namespace benchmark {
15namespace internal {
16
17// Information kept per benchmark we may want to run
Dominic Hamon3b508fa2021-05-10 17:12:09 +010018class BenchmarkInstance {
19 public:
Roman Lebedev4c2e32f2021-06-02 18:06:45 +030020 BenchmarkInstance(Benchmark* benchmark, int family_index,
Roman Lebedev80a62612021-06-02 23:45:41 +030021 int per_family_instance_index,
Roman Lebedev4c2e32f2021-06-02 18:06:45 +030022 const std::vector<int64_t>& args, int threads);
Dominic Hamon3b508fa2021-05-10 17:12:09 +010023
24 const BenchmarkName& name() const { return name_; }
Roman Lebedev4c2e32f2021-06-02 18:06:45 +030025 int family_index() const { return family_index_; }
Roman Lebedev80a62612021-06-02 23:45:41 +030026 int per_family_instance_index() const { return per_family_instance_index_; }
Dominic Hamon3b508fa2021-05-10 17:12:09 +010027 AggregationReportMode aggregation_report_mode() const {
28 return aggregation_report_mode_;
29 }
30 TimeUnit time_unit() const { return time_unit_; }
31 bool measure_process_cpu_time() const { return measure_process_cpu_time_; }
32 bool use_real_time() const { return use_real_time_; }
33 bool use_manual_time() const { return use_manual_time_; }
34 BigO complexity() const { return complexity_; }
Dominic Hamon1fcb5c22021-07-01 09:39:09 +010035 BigOFunc* complexity_lambda() const { return complexity_lambda_; }
Dominic Hamon3b508fa2021-05-10 17:12:09 +010036 const std::vector<Statistics>& statistics() const { return statistics_; }
37 int repetitions() const { return repetitions_; }
Dominic Hamone025dd52021-06-01 16:05:50 +010038 double min_time() const { return min_time_; }
Matthdonau7eb8c0f2022-05-23 14:50:17 +020039 double min_warmup_time() const { return min_warmup_time_; }
Dominic Hamon3b508fa2021-05-10 17:12:09 +010040 IterationCount iterations() const { return iterations_; }
41 int threads() const { return threads_; }
Vy Nguyenb5bb9f02021-11-17 11:51:55 -050042 void Setup() const;
43 void Teardown() const;
Dominic Hamon3b508fa2021-05-10 17:12:09 +010044
Roman Lebedevf92903c2019-05-13 12:33:11 +030045 State Run(IterationCount iters, int thread_id, internal::ThreadTimer* timer,
Mircea Trofin376ebc22021-04-28 01:25:29 -070046 internal::ThreadManager* manager,
xdje42ebb5e392024-08-01 00:42:41 -070047 internal::PerfCountersMeasurement* perf_counters_measurement,
48 ProfilerManager* profiler_manager) const;
Dominic Hamon3b508fa2021-05-10 17:12:09 +010049
50 private:
51 BenchmarkName name_;
52 Benchmark& benchmark_;
Roman Lebedev4c2e32f2021-06-02 18:06:45 +030053 const int family_index_;
Roman Lebedev80a62612021-06-02 23:45:41 +030054 const int per_family_instance_index_;
Dominic Hamon3b508fa2021-05-10 17:12:09 +010055 AggregationReportMode aggregation_report_mode_;
56 const std::vector<int64_t>& args_;
57 TimeUnit time_unit_;
58 bool measure_process_cpu_time_;
59 bool use_real_time_;
60 bool use_manual_time_;
61 BigO complexity_;
62 BigOFunc* complexity_lambda_;
Dominic Hamone025dd52021-06-01 16:05:50 +010063 UserCounters counters_;
64 const std::vector<Statistics>& statistics_;
Dominic Hamon3b508fa2021-05-10 17:12:09 +010065 int repetitions_;
66 double min_time_;
Matthdonau7eb8c0f2022-05-23 14:50:17 +020067 double min_warmup_time_;
Dominic Hamon3b508fa2021-05-10 17:12:09 +010068 IterationCount iterations_;
Dominic Hamone025dd52021-06-01 16:05:50 +010069 int threads_; // Number of concurrent threads to us
Vy Nguyenb5bb9f02021-11-17 11:51:55 -050070
71 typedef void (*callback_function)(const benchmark::State&);
72 callback_function setup_ = nullptr;
73 callback_function teardown_ = nullptr;
Ericd0384722016-09-05 15:48:40 -060074};
75
76bool FindBenchmarksInternal(const std::string& re,
Dominic Hamonedc77a32018-09-28 12:28:43 +010077 std::vector<BenchmarkInstance>* benchmarks,
Dominic Hamon332f6772016-10-07 11:35:03 -070078 std::ostream* Err);
Ericd0384722016-09-05 15:48:40 -060079
Joao Paulo Magalhaesec6f0352017-05-03 00:05:15 +010080bool IsZero(double n);
81
Sergiu Deitsch9e47d072022-02-14 11:48:53 +010082BENCHMARK_EXPORT
Joao Paulo Magalhaes17a012d2017-05-02 20:31:54 +010083ConsoleReporter::OutputOptions GetOutputOptions(bool force_no_color = false);
84
Dominic Hamon332f6772016-10-07 11:35:03 -070085} // end namespace internal
86} // end namespace benchmark
Ericd0384722016-09-05 15:48:40 -060087
Dominic Hamon332f6772016-10-07 11:35:03 -070088#endif // BENCHMARK_API_INTERNAL_H