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