xref: /aosp_15_r20/external/google-benchmark/src/reporter.cc (revision dbb99499c3810fa1611fa2242a2fc446be01a57c)
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 #include <cstdlib>
16*dbb99499SAndroid Build Coastguard Worker #include <iostream>
17*dbb99499SAndroid Build Coastguard Worker #include <map>
18*dbb99499SAndroid Build Coastguard Worker #include <string>
19*dbb99499SAndroid Build Coastguard Worker #include <tuple>
20*dbb99499SAndroid Build Coastguard Worker #include <vector>
21*dbb99499SAndroid Build Coastguard Worker 
22*dbb99499SAndroid Build Coastguard Worker #include "benchmark/benchmark.h"
23*dbb99499SAndroid Build Coastguard Worker #include "check.h"
24*dbb99499SAndroid Build Coastguard Worker #include "string_util.h"
25*dbb99499SAndroid Build Coastguard Worker #include "timers.h"
26*dbb99499SAndroid Build Coastguard Worker 
27*dbb99499SAndroid Build Coastguard Worker namespace benchmark {
28*dbb99499SAndroid Build Coastguard Worker 
BenchmarkReporter()29*dbb99499SAndroid Build Coastguard Worker BenchmarkReporter::BenchmarkReporter()
30*dbb99499SAndroid Build Coastguard Worker     : output_stream_(&std::cout), error_stream_(&std::cerr) {}
31*dbb99499SAndroid Build Coastguard Worker 
~BenchmarkReporter()32*dbb99499SAndroid Build Coastguard Worker BenchmarkReporter::~BenchmarkReporter() {}
33*dbb99499SAndroid Build Coastguard Worker 
PrintBasicContext(std::ostream * out,Context const & context)34*dbb99499SAndroid Build Coastguard Worker void BenchmarkReporter::PrintBasicContext(std::ostream *out,
35*dbb99499SAndroid Build Coastguard Worker                                           Context const &context) {
36*dbb99499SAndroid Build Coastguard Worker   BM_CHECK(out) << "cannot be null";
37*dbb99499SAndroid Build Coastguard Worker   auto &Out = *out;
38*dbb99499SAndroid Build Coastguard Worker 
39*dbb99499SAndroid Build Coastguard Worker #ifndef BENCHMARK_OS_QURT
40*dbb99499SAndroid Build Coastguard Worker   // Date/time information is not available on QuRT.
41*dbb99499SAndroid Build Coastguard Worker   // Attempting to get it via this call cause the binary to crash.
42*dbb99499SAndroid Build Coastguard Worker   Out << LocalDateTimeString() << "\n";
43*dbb99499SAndroid Build Coastguard Worker #endif
44*dbb99499SAndroid Build Coastguard Worker 
45*dbb99499SAndroid Build Coastguard Worker   if (context.executable_name)
46*dbb99499SAndroid Build Coastguard Worker     Out << "Running " << context.executable_name << "\n";
47*dbb99499SAndroid Build Coastguard Worker 
48*dbb99499SAndroid Build Coastguard Worker   const CPUInfo &info = context.cpu_info;
49*dbb99499SAndroid Build Coastguard Worker   Out << "Run on (" << info.num_cpus << " X "
50*dbb99499SAndroid Build Coastguard Worker       << (info.cycles_per_second / 1000000.0) << " MHz CPU "
51*dbb99499SAndroid Build Coastguard Worker       << ((info.num_cpus > 1) ? "s" : "") << ")\n";
52*dbb99499SAndroid Build Coastguard Worker   if (info.caches.size() != 0) {
53*dbb99499SAndroid Build Coastguard Worker     Out << "CPU Caches:\n";
54*dbb99499SAndroid Build Coastguard Worker     for (auto &CInfo : info.caches) {
55*dbb99499SAndroid Build Coastguard Worker       Out << "  L" << CInfo.level << " " << CInfo.type << " "
56*dbb99499SAndroid Build Coastguard Worker           << (CInfo.size / 1024) << " KiB";
57*dbb99499SAndroid Build Coastguard Worker       if (CInfo.num_sharing != 0)
58*dbb99499SAndroid Build Coastguard Worker         Out << " (x" << (info.num_cpus / CInfo.num_sharing) << ")";
59*dbb99499SAndroid Build Coastguard Worker       Out << "\n";
60*dbb99499SAndroid Build Coastguard Worker     }
61*dbb99499SAndroid Build Coastguard Worker   }
62*dbb99499SAndroid Build Coastguard Worker   if (!info.load_avg.empty()) {
63*dbb99499SAndroid Build Coastguard Worker     Out << "Load Average: ";
64*dbb99499SAndroid Build Coastguard Worker     for (auto It = info.load_avg.begin(); It != info.load_avg.end();) {
65*dbb99499SAndroid Build Coastguard Worker       Out << StrFormat("%.2f", *It++);
66*dbb99499SAndroid Build Coastguard Worker       if (It != info.load_avg.end()) Out << ", ";
67*dbb99499SAndroid Build Coastguard Worker     }
68*dbb99499SAndroid Build Coastguard Worker     Out << "\n";
69*dbb99499SAndroid Build Coastguard Worker   }
70*dbb99499SAndroid Build Coastguard Worker 
71*dbb99499SAndroid Build Coastguard Worker   std::map<std::string, std::string> *global_context =
72*dbb99499SAndroid Build Coastguard Worker       internal::GetGlobalContext();
73*dbb99499SAndroid Build Coastguard Worker 
74*dbb99499SAndroid Build Coastguard Worker   if (global_context != nullptr) {
75*dbb99499SAndroid Build Coastguard Worker     for (const auto &kv : *global_context) {
76*dbb99499SAndroid Build Coastguard Worker       Out << kv.first << ": " << kv.second << "\n";
77*dbb99499SAndroid Build Coastguard Worker     }
78*dbb99499SAndroid Build Coastguard Worker   }
79*dbb99499SAndroid Build Coastguard Worker 
80*dbb99499SAndroid Build Coastguard Worker   if (CPUInfo::Scaling::ENABLED == info.scaling) {
81*dbb99499SAndroid Build Coastguard Worker     Out << "***WARNING*** CPU scaling is enabled, the benchmark "
82*dbb99499SAndroid Build Coastguard Worker            "real time measurements may be noisy and will incur extra "
83*dbb99499SAndroid Build Coastguard Worker            "overhead.\n";
84*dbb99499SAndroid Build Coastguard Worker   }
85*dbb99499SAndroid Build Coastguard Worker 
86*dbb99499SAndroid Build Coastguard Worker #ifndef NDEBUG
87*dbb99499SAndroid Build Coastguard Worker   Out << "***WARNING*** Library was built as DEBUG. Timings may be "
88*dbb99499SAndroid Build Coastguard Worker          "affected.\n";
89*dbb99499SAndroid Build Coastguard Worker #endif
90*dbb99499SAndroid Build Coastguard Worker }
91*dbb99499SAndroid Build Coastguard Worker 
92*dbb99499SAndroid Build Coastguard Worker // No initializer because it's already initialized to NULL.
93*dbb99499SAndroid Build Coastguard Worker const char *BenchmarkReporter::Context::executable_name;
94*dbb99499SAndroid Build Coastguard Worker 
Context()95*dbb99499SAndroid Build Coastguard Worker BenchmarkReporter::Context::Context()
96*dbb99499SAndroid Build Coastguard Worker     : cpu_info(CPUInfo::Get()), sys_info(SystemInfo::Get()) {}
97*dbb99499SAndroid Build Coastguard Worker 
benchmark_name() const98*dbb99499SAndroid Build Coastguard Worker std::string BenchmarkReporter::Run::benchmark_name() const {
99*dbb99499SAndroid Build Coastguard Worker   std::string name = run_name.str();
100*dbb99499SAndroid Build Coastguard Worker   if (run_type == RT_Aggregate) {
101*dbb99499SAndroid Build Coastguard Worker     name += "_" + aggregate_name;
102*dbb99499SAndroid Build Coastguard Worker   }
103*dbb99499SAndroid Build Coastguard Worker   return name;
104*dbb99499SAndroid Build Coastguard Worker }
105*dbb99499SAndroid Build Coastguard Worker 
GetAdjustedRealTime() const106*dbb99499SAndroid Build Coastguard Worker double BenchmarkReporter::Run::GetAdjustedRealTime() const {
107*dbb99499SAndroid Build Coastguard Worker   double new_time = real_accumulated_time * GetTimeUnitMultiplier(time_unit);
108*dbb99499SAndroid Build Coastguard Worker   if (iterations != 0) new_time /= static_cast<double>(iterations);
109*dbb99499SAndroid Build Coastguard Worker   return new_time;
110*dbb99499SAndroid Build Coastguard Worker }
111*dbb99499SAndroid Build Coastguard Worker 
GetAdjustedCPUTime() const112*dbb99499SAndroid Build Coastguard Worker double BenchmarkReporter::Run::GetAdjustedCPUTime() const {
113*dbb99499SAndroid Build Coastguard Worker   double new_time = cpu_accumulated_time * GetTimeUnitMultiplier(time_unit);
114*dbb99499SAndroid Build Coastguard Worker   if (iterations != 0) new_time /= static_cast<double>(iterations);
115*dbb99499SAndroid Build Coastguard Worker   return new_time;
116*dbb99499SAndroid Build Coastguard Worker }
117*dbb99499SAndroid Build Coastguard Worker 
118*dbb99499SAndroid Build Coastguard Worker }  // end namespace benchmark
119