reporter.h revision 9e3465560240ffb242b50a47cb7f19251a12ee42
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 175686bf1b38f8aa713267097d7c1944140f71b5d3Eric#include <cassert> 185686bf1b38f8aa713267097d7c1944140f71b5d3Eric#include <iosfwd> 194242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier#include <string> 204242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier#include <utility> 214242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier#include <vector> 22a9a66c85bbfda1d744c267c5e5aa073ef3d1c1d5jpmag#include <set> 234242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 2422cb9d9ce0ff12219f5ca6c4a28124d11730e66fIsmael#include "benchmark_api.h" // For forward declaration of BenchmarkReporter 25df904a1980b148139e566028dad27e3bea828afdEric Fiselier 264242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiseliernamespace benchmark { 274242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 284242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// Interface for custom benchmark result printers. 294242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// By default, benchmark reports are printed to stdout. However an application 304242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// can control the destination of the reports by calling 314242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// RunSpecifiedBenchmarks and passing it a custom reporter object. 324242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// The reporter object must implement the following interface. 334242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselierclass BenchmarkReporter { 344242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier public: 354242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier struct Context { 364242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier int num_cpus; 374242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier double mhz_per_cpu; 384242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier bool cpu_scaling_enabled; 394242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 404242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // The number of chars in the longest benchmark name. 414242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier size_t name_field_width; 424242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier }; 434242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 444242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier struct Run { 45332f677b8bec401641a2743ab5d741c13cc6811dDominic Hamon Run() 46332f677b8bec401641a2743ab5d741c13cc6811dDominic Hamon : error_occurred(false), 47332f677b8bec401641a2743ab5d741c13cc6811dDominic Hamon iterations(1), 48332f677b8bec401641a2743ab5d741c13cc6811dDominic Hamon time_unit(kNanosecond), 49332f677b8bec401641a2743ab5d741c13cc6811dDominic Hamon real_accumulated_time(0), 50332f677b8bec401641a2743ab5d741c13cc6811dDominic Hamon cpu_accumulated_time(0), 51332f677b8bec401641a2743ab5d741c13cc6811dDominic Hamon bytes_per_second(0), 52332f677b8bec401641a2743ab5d741c13cc6811dDominic Hamon items_per_second(0), 53332f677b8bec401641a2743ab5d741c13cc6811dDominic Hamon max_heapbytes_used(0), 54332f677b8bec401641a2743ab5d741c13cc6811dDominic Hamon complexity(oNone), 55332f677b8bec401641a2743ab5d741c13cc6811dDominic Hamon complexity_lambda(), 56332f677b8bec401641a2743ab5d741c13cc6811dDominic Hamon complexity_n(0), 57332f677b8bec401641a2743ab5d741c13cc6811dDominic Hamon report_big_o(false), 58a9a66c85bbfda1d744c267c5e5aa073ef3d1c1d5jpmag report_rms(false), 59a9a66c85bbfda1d744c267c5e5aa073ef3d1c1d5jpmag counters() {} 604242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 614242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier std::string benchmark_name; 624242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier std::string report_label; // Empty if not set by benchmark. 6343017f8b1510a50855e6b0ea145a534d3d754068Eric Fiselier bool error_occurred; 6443017f8b1510a50855e6b0ea145a534d3d754068Eric Fiselier std::string error_message; 6543017f8b1510a50855e6b0ea145a534d3d754068Eric Fiselier 662cf277b6f65d882cc8d3010fc1c91deb5edb32baJean-Louis Leroy int64_t iterations; 677c69b36078b5773fbd6b09b539a30400138607a7Kai Wolf TimeUnit time_unit; 684242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier double real_accumulated_time; 694242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier double cpu_accumulated_time; 704242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 711b263fe6d906bb0854b84247f1b395bbacd3b88eEric // Return a value representing the real time per iteration in the unit 721b263fe6d906bb0854b84247f1b395bbacd3b88eEric // specified by 'time_unit'. 731b263fe6d906bb0854b84247f1b395bbacd3b88eEric // NOTE: If 'iterations' is zero the returned value represents the 741b263fe6d906bb0854b84247f1b395bbacd3b88eEric // accumulated time. 751b263fe6d906bb0854b84247f1b395bbacd3b88eEric double GetAdjustedRealTime() const; 761b263fe6d906bb0854b84247f1b395bbacd3b88eEric 771b263fe6d906bb0854b84247f1b395bbacd3b88eEric // Return a value representing the cpu time per iteration in the unit 781b263fe6d906bb0854b84247f1b395bbacd3b88eEric // specified by 'time_unit'. 791b263fe6d906bb0854b84247f1b395bbacd3b88eEric // NOTE: If 'iterations' is zero the returned value represents the 801b263fe6d906bb0854b84247f1b395bbacd3b88eEric // accumulated time. 811b263fe6d906bb0854b84247f1b395bbacd3b88eEric double GetAdjustedCPUTime() const; 821b263fe6d906bb0854b84247f1b395bbacd3b88eEric 834242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // Zero if not set by benchmark. 844242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier double bytes_per_second; 854242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier double items_per_second; 864242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 874242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // This is set to 0.0 if memory tracing is not enabled. 884242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier double max_heapbytes_used; 8911e304355492670709c60e6d39eb42fc01fd878aIsmael 90b73dc22944cb933289bbdbf5bb6616dbfc50168fIsmael // Keep track of arguments to compute asymptotic complexity 91867f9145a0a45f8b993cec8b48309c19391acaa0Ismael BigO complexity; 92867f9145a0a45f8b993cec8b48309c19391acaa0Ismael BigOFunc* complexity_lambda; 932859ae93949a7a3415082e65001f25e8e5e78284Ismael int complexity_n; 9411e304355492670709c60e6d39eb42fc01fd878aIsmael 95290bd60289ef571875415cf82be805f9a446c6a9Ismael // Inform print function whether the current run is a complexity report 965f9823bd92b2a24da06fac7b43f6658ec20cc901Ismael bool report_big_o; 972e5c397b4829503a5cb023ac67d2a1f13ebda3aaIsmael bool report_rms; 98a9a66c85bbfda1d744c267c5e5aa073ef3d1c1d5jpmag 999e3465560240ffb242b50a47cb7f19251a12ee42jpmag UserCounters counters; 1004242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier }; 1014242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 1025686bf1b38f8aa713267097d7c1944140f71b5d3Eric // Construct a BenchmarkReporter with the output stream set to 'std::cout' 1035686bf1b38f8aa713267097d7c1944140f71b5d3Eric // and the error stream set to 'std::cerr' 1045686bf1b38f8aa713267097d7c1944140f71b5d3Eric BenchmarkReporter(); 1055686bf1b38f8aa713267097d7c1944140f71b5d3Eric 1064242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // Called once for every suite of benchmarks run. 1074242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // The parameter "context" contains information that the 1084242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // reporter may wish to use when generating its report, for example the 1094242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // platform under which the benchmarks are running. The benchmark run is 1104242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // never started if this function returns false, allowing the reporter 1114242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // to skip runs based on the context information. 11220f1c0e2a8e692076dd7a5586f73ab8e2d726c12Eric Fiselier virtual bool ReportContext(const Context& context) = 0; 1134242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 1144242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier // Called once for each group of benchmark runs, gives information about 1151b263fe6d906bb0854b84247f1b395bbacd3b88eEric // cpu-time and heap memory usage during the benchmark run. If the group 1161b263fe6d906bb0854b84247f1b395bbacd3b88eEric // of runs contained more than two entries then 'report' contains additional 1171b263fe6d906bb0854b84247f1b395bbacd3b88eEric // elements representing the mean and standard deviation of those runs. 1181b263fe6d906bb0854b84247f1b395bbacd3b88eEric // Additionally if this group of runs was the last in a family of benchmarks 1191b263fe6d906bb0854b84247f1b395bbacd3b88eEric // 'reports' contains additional entries representing the asymptotic 1201b263fe6d906bb0854b84247f1b395bbacd3b88eEric // complexity and RMS of that benchmark family. 12120f1c0e2a8e692076dd7a5586f73ab8e2d726c12Eric Fiselier virtual void ReportRuns(const std::vector<Run>& report) = 0; 12211e304355492670709c60e6d39eb42fc01fd878aIsmael 12320f1c0e2a8e692076dd7a5586f73ab8e2d726c12Eric Fiselier // Called once and only once after ever group of benchmarks is run and 12420f1c0e2a8e692076dd7a5586f73ab8e2d726c12Eric Fiselier // reported. 1251b263fe6d906bb0854b84247f1b395bbacd3b88eEric virtual void Finalize() {} 1264242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 1275686bf1b38f8aa713267097d7c1944140f71b5d3Eric // REQUIRES: The object referenced by 'out' is valid for the lifetime 1285686bf1b38f8aa713267097d7c1944140f71b5d3Eric // of the reporter. 1295686bf1b38f8aa713267097d7c1944140f71b5d3Eric void SetOutputStream(std::ostream* out) { 1305686bf1b38f8aa713267097d7c1944140f71b5d3Eric assert(out); 1315686bf1b38f8aa713267097d7c1944140f71b5d3Eric output_stream_ = out; 1325686bf1b38f8aa713267097d7c1944140f71b5d3Eric } 1335686bf1b38f8aa713267097d7c1944140f71b5d3Eric 1345686bf1b38f8aa713267097d7c1944140f71b5d3Eric // REQUIRES: The object referenced by 'err' is valid for the lifetime 1355686bf1b38f8aa713267097d7c1944140f71b5d3Eric // of the reporter. 1365686bf1b38f8aa713267097d7c1944140f71b5d3Eric void SetErrorStream(std::ostream* err) { 1375686bf1b38f8aa713267097d7c1944140f71b5d3Eric assert(err); 1385686bf1b38f8aa713267097d7c1944140f71b5d3Eric error_stream_ = err; 1395686bf1b38f8aa713267097d7c1944140f71b5d3Eric } 1405686bf1b38f8aa713267097d7c1944140f71b5d3Eric 141332f677b8bec401641a2743ab5d741c13cc6811dDominic Hamon std::ostream& GetOutputStream() const { return *output_stream_; } 1425686bf1b38f8aa713267097d7c1944140f71b5d3Eric 143332f677b8bec401641a2743ab5d741c13cc6811dDominic Hamon std::ostream& GetErrorStream() const { return *error_stream_; } 1442859ae93949a7a3415082e65001f25e8e5e78284Ismael 1454242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier virtual ~BenchmarkReporter(); 1461b263fe6d906bb0854b84247f1b395bbacd3b88eEric 1471b263fe6d906bb0854b84247f1b395bbacd3b88eEric // Write a human readable string to 'out' representing the specified 1481b263fe6d906bb0854b84247f1b395bbacd3b88eEric // 'context'. 1491b263fe6d906bb0854b84247f1b395bbacd3b88eEric // REQUIRES: 'out' is non-null. 1501b263fe6d906bb0854b84247f1b395bbacd3b88eEric static void PrintBasicContext(std::ostream* out, Context const& context); 1515686bf1b38f8aa713267097d7c1944140f71b5d3Eric 15222cb9d9ce0ff12219f5ca6c4a28124d11730e66fIsmael private: 1535686bf1b38f8aa713267097d7c1944140f71b5d3Eric std::ostream* output_stream_; 1545686bf1b38f8aa713267097d7c1944140f71b5d3Eric std::ostream* error_stream_; 1554242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier}; 1564242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 1574242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// Simple reporter that outputs benchmark data to the console. This is the 1584242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier// default reporter used by RunSpecifiedBenchmarks(). 1594242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselierclass ConsoleReporter : public BenchmarkReporter { 160332f677b8bec401641a2743ab5d741c13cc6811dDominic Hamon public: 161332f677b8bec401641a2743ab5d741c13cc6811dDominic Hamon enum OutputOptions { OO_None, OO_Color }; 16244128d87d2846fc20d540ef41eda6da9ffbb6abaEric Fiselier explicit ConsoleReporter(OutputOptions color_output = OO_Color) 1632aca242bf69870cc208cb7da3c026c1f64b12cdbEric Fiselier : name_field_width_(0), color_output_(color_output == OO_Color) {} 16444128d87d2846fc20d540ef41eda6da9ffbb6abaEric Fiselier 16520f1c0e2a8e692076dd7a5586f73ab8e2d726c12Eric Fiselier virtual bool ReportContext(const Context& context); 16620f1c0e2a8e692076dd7a5586f73ab8e2d726c12Eric Fiselier virtual void ReportRuns(const std::vector<Run>& reports); 1677c69b36078b5773fbd6b09b539a30400138607a7Kai Wolf 168332f677b8bec401641a2743ab5d741c13cc6811dDominic Hamon protected: 16920f1c0e2a8e692076dd7a5586f73ab8e2d726c12Eric Fiselier virtual void PrintRunData(const Run& report); 170a9a66c85bbfda1d744c267c5e5aa073ef3d1c1d5jpmag virtual void PrintHeader(const Run& report); 171a9a66c85bbfda1d744c267c5e5aa073ef3d1c1d5jpmag 17220f1c0e2a8e692076dd7a5586f73ab8e2d726c12Eric Fiselier size_t name_field_width_; 173a9a66c85bbfda1d744c267c5e5aa073ef3d1c1d5jpmag bool printed_header_; 17444128d87d2846fc20d540ef41eda6da9ffbb6abaEric Fiselier 175332f677b8bec401641a2743ab5d741c13cc6811dDominic Hamon private: 17644128d87d2846fc20d540ef41eda6da9ffbb6abaEric Fiselier bool color_output_; 1774242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier}; 1784242f2f1d73d7800d95cfc2af0f3a3513dad2dc5Eric Fiselier 179f65da9d58165c6ab626d6a55b9d47968510c72aeEric Fiselierclass JSONReporter : public BenchmarkReporter { 18022cb9d9ce0ff12219f5ca6c4a28124d11730e66fIsmael public: 181f65da9d58165c6ab626d6a55b9d47968510c72aeEric Fiselier JSONReporter() : first_report_(true) {} 182f65da9d58165c6ab626d6a55b9d47968510c72aeEric Fiselier virtual bool ReportContext(const Context& context); 183f65da9d58165c6ab626d6a55b9d47968510c72aeEric Fiselier virtual void ReportRuns(const std::vector<Run>& reports); 184f65da9d58165c6ab626d6a55b9d47968510c72aeEric Fiselier virtual void Finalize(); 185f65da9d58165c6ab626d6a55b9d47968510c72aeEric Fiselier 18622cb9d9ce0ff12219f5ca6c4a28124d11730e66fIsmael private: 187f65da9d58165c6ab626d6a55b9d47968510c72aeEric Fiselier void PrintRunData(const Run& report); 188f65da9d58165c6ab626d6a55b9d47968510c72aeEric Fiselier 189f65da9d58165c6ab626d6a55b9d47968510c72aeEric Fiselier bool first_report_; 190f65da9d58165c6ab626d6a55b9d47968510c72aeEric Fiselier}; 191f65da9d58165c6ab626d6a55b9d47968510c72aeEric Fiselier 19271c41cde57d7c741fca05b07585966129cf2ac5bDominic Hamonclass CSVReporter : public BenchmarkReporter { 19322cb9d9ce0ff12219f5ca6c4a28124d11730e66fIsmael public: 194a9a66c85bbfda1d744c267c5e5aa073ef3d1c1d5jpmag CSVReporter() : printed_header_(false) {} 19571c41cde57d7c741fca05b07585966129cf2ac5bDominic Hamon virtual bool ReportContext(const Context& context); 19671c41cde57d7c741fca05b07585966129cf2ac5bDominic Hamon virtual void ReportRuns(const std::vector<Run>& reports); 19771c41cde57d7c741fca05b07585966129cf2ac5bDominic Hamon 19822cb9d9ce0ff12219f5ca6c4a28124d11730e66fIsmael private: 19971c41cde57d7c741fca05b07585966129cf2ac5bDominic Hamon void PrintRunData(const Run& report); 200a9a66c85bbfda1d744c267c5e5aa073ef3d1c1d5jpmag 201a9a66c85bbfda1d744c267c5e5aa073ef3d1c1d5jpmag bool printed_header_; 202a9a66c85bbfda1d744c267c5e5aa073ef3d1c1d5jpmag std::set< std::string > user_counter_names_; 20371c41cde57d7c741fca05b07585966129cf2ac5bDominic Hamon}; 20471c41cde57d7c741fca05b07585966129cf2ac5bDominic Hamon 20502230445e065456371cea2a18d5fee6a33b0c1d9Eric Fiselierinline const char* GetTimeUnitString(TimeUnit unit) { 20602230445e065456371cea2a18d5fee6a33b0c1d9Eric Fiselier switch (unit) { 20722cb9d9ce0ff12219f5ca6c4a28124d11730e66fIsmael case kMillisecond: 20822cb9d9ce0ff12219f5ca6c4a28124d11730e66fIsmael return "ms"; 20922cb9d9ce0ff12219f5ca6c4a28124d11730e66fIsmael case kMicrosecond: 21022cb9d9ce0ff12219f5ca6c4a28124d11730e66fIsmael return "us"; 21122cb9d9ce0ff12219f5ca6c4a28124d11730e66fIsmael case kNanosecond: 21222cb9d9ce0ff12219f5ca6c4a28124d11730e66fIsmael default: 21322cb9d9ce0ff12219f5ca6c4a28124d11730e66fIsmael return "ns"; 21402230445e065456371cea2a18d5fee6a33b0c1d9Eric Fiselier } 21502230445e065456371cea2a18d5fee6a33b0c1d9Eric Fiselier} 21602230445e065456371cea2a18d5fee6a33b0c1d9Eric Fiselier 21702230445e065456371cea2a18d5fee6a33b0c1d9Eric Fiselierinline double GetTimeUnitMultiplier(TimeUnit unit) { 218867f9145a0a45f8b993cec8b48309c19391acaa0Ismael switch (unit) { 21922cb9d9ce0ff12219f5ca6c4a28124d11730e66fIsmael case kMillisecond: 22022cb9d9ce0ff12219f5ca6c4a28124d11730e66fIsmael return 1e3; 22122cb9d9ce0ff12219f5ca6c4a28124d11730e66fIsmael case kMicrosecond: 22222cb9d9ce0ff12219f5ca6c4a28124d11730e66fIsmael return 1e6; 22322cb9d9ce0ff12219f5ca6c4a28124d11730e66fIsmael case kNanosecond: 22422cb9d9ce0ff12219f5ca6c4a28124d11730e66fIsmael default: 22522cb9d9ce0ff12219f5ca6c4a28124d11730e66fIsmael return 1e9; 22602230445e065456371cea2a18d5fee6a33b0c1d9Eric Fiselier } 22702230445e065456371cea2a18d5fee6a33b0c1d9Eric Fiselier} 22802230445e065456371cea2a18d5fee6a33b0c1d9Eric Fiselier 22922cb9d9ce0ff12219f5ca6c4a28124d11730e66fIsmael} // end namespace benchmark 23022cb9d9ce0ff12219f5ca6c4a28124d11730e66fIsmael#endif // BENCHMARK_REPORTER_H_ 231