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