Index: third_party/google_benchmark/include/benchmark/reporter.h |
diff --git a/third_party/google_benchmark/include/benchmark/reporter.h b/third_party/google_benchmark/include/benchmark/reporter.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8821ebfa4c81d80507f9c97ee88cd7d9173deb0c |
--- /dev/null |
+++ b/third_party/google_benchmark/include/benchmark/reporter.h |
@@ -0,0 +1,236 @@ |
+// Copyright 2015 Google Inc. All rights reserved. |
+// |
+// Licensed under the Apache License, Version 2.0 (the "License"); |
+// you may not use this file except in compliance with the License. |
+// You may obtain a copy of the License at |
+// |
+// http://www.apache.org/licenses/LICENSE-2.0 |
+// |
+// Unless required by applicable law or agreed to in writing, software |
+// distributed under the License is distributed on an "AS IS" BASIS, |
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+// See the License for the specific language governing permissions and |
+// limitations under the License. |
+#ifndef BENCHMARK_REPORTER_H_ |
+#define BENCHMARK_REPORTER_H_ |
+ |
+#include <cassert> |
+#include <iosfwd> |
+#include <string> |
+#include <utility> |
+#include <vector> |
+#include <set> |
+ |
+#include "benchmark_api.h" // For forward declaration of BenchmarkReporter |
+ |
+namespace benchmark { |
+ |
+// Interface for custom benchmark result printers. |
+// By default, benchmark reports are printed to stdout. However an application |
+// can control the destination of the reports by calling |
+// RunSpecifiedBenchmarks and passing it a custom reporter object. |
+// The reporter object must implement the following interface. |
+class BenchmarkReporter { |
+ public: |
+ struct Context { |
+ int num_cpus; |
+ double mhz_per_cpu; |
+ bool cpu_scaling_enabled; |
+ |
+ // The number of chars in the longest benchmark name. |
+ size_t name_field_width; |
+ }; |
+ |
+ struct Run { |
+ Run() |
+ : error_occurred(false), |
+ iterations(1), |
+ time_unit(kNanosecond), |
+ real_accumulated_time(0), |
+ cpu_accumulated_time(0), |
+ bytes_per_second(0), |
+ items_per_second(0), |
+ max_heapbytes_used(0), |
+ complexity(oNone), |
+ complexity_lambda(), |
+ complexity_n(0), |
+ report_big_o(false), |
+ report_rms(false), |
+ counters() {} |
+ |
+ std::string benchmark_name; |
+ std::string report_label; // Empty if not set by benchmark. |
+ bool error_occurred; |
+ std::string error_message; |
+ |
+ int64_t iterations; |
+ TimeUnit time_unit; |
+ double real_accumulated_time; |
+ double cpu_accumulated_time; |
+ |
+ // Return a value representing the real time per iteration in the unit |
+ // specified by 'time_unit'. |
+ // NOTE: If 'iterations' is zero the returned value represents the |
+ // accumulated time. |
+ double GetAdjustedRealTime() const; |
+ |
+ // Return a value representing the cpu time per iteration in the unit |
+ // specified by 'time_unit'. |
+ // NOTE: If 'iterations' is zero the returned value represents the |
+ // accumulated time. |
+ double GetAdjustedCPUTime() const; |
+ |
+ // Zero if not set by benchmark. |
+ double bytes_per_second; |
+ double items_per_second; |
+ |
+ // This is set to 0.0 if memory tracing is not enabled. |
+ double max_heapbytes_used; |
+ |
+ // Keep track of arguments to compute asymptotic complexity |
+ BigO complexity; |
+ BigOFunc* complexity_lambda; |
+ int complexity_n; |
+ |
+ // Inform print function whether the current run is a complexity report |
+ bool report_big_o; |
+ bool report_rms; |
+ |
+ UserCounters counters; |
+ }; |
+ |
+ // Construct a BenchmarkReporter with the output stream set to 'std::cout' |
+ // and the error stream set to 'std::cerr' |
+ BenchmarkReporter(); |
+ |
+ // Called once for every suite of benchmarks run. |
+ // The parameter "context" contains information that the |
+ // reporter may wish to use when generating its report, for example the |
+ // platform under which the benchmarks are running. The benchmark run is |
+ // never started if this function returns false, allowing the reporter |
+ // to skip runs based on the context information. |
+ virtual bool ReportContext(const Context& context) = 0; |
+ |
+ // Called once for each group of benchmark runs, gives information about |
+ // cpu-time and heap memory usage during the benchmark run. If the group |
+ // of runs contained more than two entries then 'report' contains additional |
+ // elements representing the mean and standard deviation of those runs. |
+ // Additionally if this group of runs was the last in a family of benchmarks |
+ // 'reports' contains additional entries representing the asymptotic |
+ // complexity and RMS of that benchmark family. |
+ virtual void ReportRuns(const std::vector<Run>& report) = 0; |
+ |
+ // Called once and only once after ever group of benchmarks is run and |
+ // reported. |
+ virtual void Finalize() {} |
+ |
+ // REQUIRES: The object referenced by 'out' is valid for the lifetime |
+ // of the reporter. |
+ void SetOutputStream(std::ostream* out) { |
+ assert(out); |
+ output_stream_ = out; |
+ } |
+ |
+ // REQUIRES: The object referenced by 'err' is valid for the lifetime |
+ // of the reporter. |
+ void SetErrorStream(std::ostream* err) { |
+ assert(err); |
+ error_stream_ = err; |
+ } |
+ |
+ std::ostream& GetOutputStream() const { return *output_stream_; } |
+ |
+ std::ostream& GetErrorStream() const { return *error_stream_; } |
+ |
+ virtual ~BenchmarkReporter(); |
+ |
+ // Write a human readable string to 'out' representing the specified |
+ // 'context'. |
+ // REQUIRES: 'out' is non-null. |
+ static void PrintBasicContext(std::ostream* out, Context const& context); |
+ |
+ private: |
+ std::ostream* output_stream_; |
+ std::ostream* error_stream_; |
+}; |
+ |
+// Simple reporter that outputs benchmark data to the console. This is the |
+// default reporter used by RunSpecifiedBenchmarks(). |
+class ConsoleReporter : public BenchmarkReporter { |
+public: |
+ enum OutputOptions { |
+ OO_None = 0, |
+ OO_Color = 1, |
+ OO_Tabular = 2, |
+ OO_ColorTabular = OO_Color|OO_Tabular, |
+ OO_Defaults = OO_ColorTabular |
+ }; |
+ explicit ConsoleReporter(OutputOptions opts_ = OO_Defaults) |
+ : output_options_(opts_), name_field_width_(0), |
+ prev_counters_(), printed_header_(false) {} |
+ |
+ virtual bool ReportContext(const Context& context); |
+ virtual void ReportRuns(const std::vector<Run>& reports); |
+ |
+ protected: |
+ virtual void PrintRunData(const Run& report); |
+ virtual void PrintHeader(const Run& report); |
+ |
+ OutputOptions output_options_; |
+ size_t name_field_width_; |
+ UserCounters prev_counters_; |
+ bool printed_header_; |
+}; |
+ |
+class JSONReporter : public BenchmarkReporter { |
+ public: |
+ JSONReporter() : first_report_(true) {} |
+ virtual bool ReportContext(const Context& context); |
+ virtual void ReportRuns(const std::vector<Run>& reports); |
+ virtual void Finalize(); |
+ |
+ private: |
+ void PrintRunData(const Run& report); |
+ |
+ bool first_report_; |
+}; |
+ |
+class CSVReporter : public BenchmarkReporter { |
+ public: |
+ CSVReporter() : printed_header_(false) {} |
+ virtual bool ReportContext(const Context& context); |
+ virtual void ReportRuns(const std::vector<Run>& reports); |
+ |
+ private: |
+ void PrintRunData(const Run& report); |
+ |
+ bool printed_header_; |
+ std::set< std::string > user_counter_names_; |
+}; |
+ |
+inline const char* GetTimeUnitString(TimeUnit unit) { |
+ switch (unit) { |
+ case kMillisecond: |
+ return "ms"; |
+ case kMicrosecond: |
+ return "us"; |
+ case kNanosecond: |
+ default: |
+ return "ns"; |
+ } |
+} |
+ |
+inline double GetTimeUnitMultiplier(TimeUnit unit) { |
+ switch (unit) { |
+ case kMillisecond: |
+ return 1e3; |
+ case kMicrosecond: |
+ return 1e6; |
+ case kNanosecond: |
+ default: |
+ return 1e9; |
+ } |
+} |
+ |
+} // end namespace benchmark |
+#endif // BENCHMARK_REPORTER_H_ |