119 lines · plain
1// Copyright 2015 Google Inc. All rights reserved.2//3// Licensed under the Apache License, Version 2.0 (the "License");4// you may not use this file except in compliance with the License.5// You may obtain a copy of the License at6//7// http://www.apache.org/licenses/LICENSE-2.08//9// Unless required by applicable law or agreed to in writing, software10// distributed under the License is distributed on an "AS IS" BASIS,11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.12// See the License for the specific language governing permissions and13// limitations under the License.14 15#include <cstdlib>16#include <iostream>17#include <map>18#include <string>19#include <tuple>20#include <vector>21 22#include "benchmark/benchmark.h"23#include "check.h"24#include "string_util.h"25#include "timers.h"26 27namespace benchmark {28 29BenchmarkReporter::BenchmarkReporter()30 : output_stream_(&std::cout), error_stream_(&std::cerr) {}31 32BenchmarkReporter::~BenchmarkReporter() {}33 34void BenchmarkReporter::PrintBasicContext(std::ostream *out,35 Context const &context) {36 BM_CHECK(out) << "cannot be null";37 auto &Out = *out;38 39#ifndef BENCHMARK_OS_QURT40 // Date/time information is not available on QuRT.41 // Attempting to get it via this call cause the binary to crash.42 Out << LocalDateTimeString() << "\n";43#endif44 45 if (context.executable_name)46 Out << "Running " << context.executable_name << "\n";47 48 const CPUInfo &info = context.cpu_info;49 Out << "Run on (" << info.num_cpus << " X "50 << (info.cycles_per_second / 1000000.0) << " MHz CPU "51 << ((info.num_cpus > 1) ? "s" : "") << ")\n";52 if (info.caches.size() != 0) {53 Out << "CPU Caches:\n";54 for (auto &CInfo : info.caches) {55 Out << " L" << CInfo.level << " " << CInfo.type << " "56 << (CInfo.size / 1024) << " KiB";57 if (CInfo.num_sharing != 0)58 Out << " (x" << (info.num_cpus / CInfo.num_sharing) << ")";59 Out << "\n";60 }61 }62 if (!info.load_avg.empty()) {63 Out << "Load Average: ";64 for (auto It = info.load_avg.begin(); It != info.load_avg.end();) {65 Out << StrFormat("%.2f", *It++);66 if (It != info.load_avg.end()) Out << ", ";67 }68 Out << "\n";69 }70 71 std::map<std::string, std::string> *global_context =72 internal::GetGlobalContext();73 74 if (global_context != nullptr) {75 for (const auto &kv : *global_context) {76 Out << kv.first << ": " << kv.second << "\n";77 }78 }79 80 if (CPUInfo::Scaling::ENABLED == info.scaling) {81 Out << "***WARNING*** CPU scaling is enabled, the benchmark "82 "real time measurements may be noisy and will incur extra "83 "overhead.\n";84 }85 86#ifndef NDEBUG87 Out << "***WARNING*** Library was built as DEBUG. Timings may be "88 "affected.\n";89#endif90}91 92// No initializer because it's already initialized to NULL.93const char *BenchmarkReporter::Context::executable_name;94 95BenchmarkReporter::Context::Context()96 : cpu_info(CPUInfo::Get()), sys_info(SystemInfo::Get()) {}97 98std::string BenchmarkReporter::Run::benchmark_name() const {99 std::string name = run_name.str();100 if (run_type == RT_Aggregate) {101 name += "_" + aggregate_name;102 }103 return name;104}105 106double BenchmarkReporter::Run::GetAdjustedRealTime() const {107 double new_time = real_accumulated_time * GetTimeUnitMultiplier(time_unit);108 if (iterations != 0) new_time /= static_cast<double>(iterations);109 return new_time;110}111 112double BenchmarkReporter::Run::GetAdjustedCPUTime() const {113 double new_time = cpu_accumulated_time * GetTimeUnitMultiplier(time_unit);114 if (iterations != 0) new_time /= static_cast<double>(iterations);115 return new_time;116}117 118} // end namespace benchmark119