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