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