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