reporter.h revision 4242f2f1d73d7800d95cfc2af0f3a3513dad2dc5
14242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// Copyright 2015 Google Inc. All rights reserved. 24242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// 34242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// Licensed under the Apache License, Version 2.0 (the "License"); 44242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// you may not use this file except in compliance with the License. 54242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// You may obtain a copy of the License at 64242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// 74242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// http://www.apache.org/licenses/LICENSE-2.0 84242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// 94242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// Unless required by applicable law or agreed to in writing, software 104242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// distributed under the License is distributed on an "AS IS" BASIS, 114242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// See the License for the specific language governing permissions and 134242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// limitations under the License. 144242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier#ifndef BENCHMARK_REPORTER_H_ 154242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier#define BENCHMARK_REPORTER_H_ 164242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 174242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier#include <string> 184242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier#include <utility> 194242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier#include <vector> 204242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 214242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiseliernamespace benchmark { 224242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 234242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// Interface for custom benchmark result printers. 244242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// By default, benchmark reports are printed to stdout. However an application 254242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// can control the destination of the reports by calling 264242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// RunSpecifiedBenchmarks and passing it a custom reporter object. 274242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// The reporter object must implement the following interface. 284242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselierclass BenchmarkReporter { 294242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier public: 304242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier struct Context { 314242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier int num_cpus; 324242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier double mhz_per_cpu; 334242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier bool cpu_scaling_enabled; 344242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 354242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // The number of chars in the longest benchmark name. 364242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier size_t name_field_width; 374242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier }; 384242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 394242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier struct Run { 404242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier Run() : 414242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier iterations(1), 424242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier real_accumulated_time(0), 434242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier cpu_accumulated_time(0), 444242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier bytes_per_second(0), 454242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier items_per_second(0), 464242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier max_heapbytes_used(0) {} 474242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 484242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier std::string benchmark_name; 494242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier std::string report_label; // Empty if not set by benchmark. 504242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier size_t iterations; 514242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier double real_accumulated_time; 524242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier double cpu_accumulated_time; 534242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 544242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // Zero if not set by benchmark. 554242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier double bytes_per_second; 564242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier double items_per_second; 574242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 584242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // This is set to 0.0 if memory tracing is not enabled. 594242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier double max_heapbytes_used; 604242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier }; 614242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 624242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // Called once for every suite of benchmarks run. 634242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // The parameter "context" contains information that the 644242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // reporter may wish to use when generating its report, for example the 654242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // platform under which the benchmarks are running. The benchmark run is 664242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // never started if this function returns false, allowing the reporter 674242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // to skip runs based on the context information. 684242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier virtual bool ReportContext(const Context& context) const = 0; 694242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 704242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // Called once for each group of benchmark runs, gives information about 714242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // cpu-time and heap memory usage during the benchmark run. 724242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // Note that all the grouped benchmark runs should refer to the same 734242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // benchmark, thus have the same name. 744242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier virtual void ReportRuns(const std::vector<Run>& report) const = 0; 754242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 764242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier virtual ~BenchmarkReporter(); 774242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier}; 784242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 794242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 804242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiseliernamespace internal { 814242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 824242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// ------------------------------------------------------ 834242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// Internal implementation details follow; please ignore 844242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 854242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// Simple reporter that outputs benchmark data to the console. This is the 864242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// default reporter used by RunSpecifiedBenchmarks(). 874242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselierclass ConsoleReporter : public BenchmarkReporter { 884242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier public: 894242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier virtual bool ReportContext(const Context& context) const; 904242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier virtual void ReportRuns(const std::vector<Run>& reports) const; 914242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier private: 924242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier virtual void PrintRunData(const Run& report) const; 934242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // TODO(ericwf): Find a better way to share this information. 944242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier mutable size_t name_field_width_; 954242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier}; 964242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 974242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier} // end namespace internal 984242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier} // end namespace benchmark 994242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier#endif // BENCHMARK_REPORTER_H_ 100