Home | History | Annotate | Download | only in src
      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 at
      6 //
      7 //     http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // 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 and
     13 // limitations under the License.
     14 
     15 #include "benchmark/reporter.h"
     16 
     17 #include <cstdlib>
     18 #include <vector>
     19 
     20 #include "check.h"
     21 #include "stat.h"
     22 
     23 namespace benchmark {
     24 
     25 void BenchmarkReporter::ComputeStats(
     26     const std::vector<Run>& reports,
     27     Run* mean_data, Run* stddev_data) {
     28   CHECK(reports.size() >= 2) << "Cannot compute stats for less than 2 reports";
     29   // Accumulators.
     30   Stat1_d real_accumulated_time_stat;
     31   Stat1_d cpu_accumulated_time_stat;
     32   Stat1_d bytes_per_second_stat;
     33   Stat1_d items_per_second_stat;
     34   // All repetitions should be run with the same number of iterations so we
     35   // can take this information from the first benchmark.
     36   int64_t const run_iterations = reports.front().iterations;
     37 
     38   // Populate the accumulators.
     39   for (Run const& run : reports) {
     40     CHECK_EQ(reports[0].benchmark_name, run.benchmark_name);
     41     CHECK_EQ(run_iterations, run.iterations);
     42     real_accumulated_time_stat +=
     43         Stat1_d(run.real_accumulated_time/run.iterations, run.iterations);
     44     cpu_accumulated_time_stat +=
     45         Stat1_d(run.cpu_accumulated_time/run.iterations, run.iterations);
     46     items_per_second_stat += Stat1_d(run.items_per_second, run.iterations);
     47     bytes_per_second_stat += Stat1_d(run.bytes_per_second, run.iterations);
     48   }
     49 
     50   // Get the data from the accumulator to BenchmarkReporter::Run's.
     51   mean_data->benchmark_name = reports[0].benchmark_name + "_mean";
     52   mean_data->iterations = run_iterations;
     53   mean_data->real_accumulated_time = real_accumulated_time_stat.Mean() *
     54                                      run_iterations;
     55   mean_data->cpu_accumulated_time = cpu_accumulated_time_stat.Mean() *
     56                                     run_iterations;
     57   mean_data->bytes_per_second = bytes_per_second_stat.Mean();
     58   mean_data->items_per_second = items_per_second_stat.Mean();
     59 
     60   // Only add label to mean/stddev if it is same for all runs
     61   mean_data->report_label = reports[0].report_label;
     62   for (std::size_t i = 1; i < reports.size(); i++) {
     63     if (reports[i].report_label != reports[0].report_label) {
     64       mean_data->report_label = "";
     65       break;
     66     }
     67   }
     68 
     69   stddev_data->benchmark_name = reports[0].benchmark_name + "_stddev";
     70   stddev_data->report_label = mean_data->report_label;
     71   stddev_data->iterations = 0;
     72   stddev_data->real_accumulated_time =
     73       real_accumulated_time_stat.StdDev();
     74   stddev_data->cpu_accumulated_time =
     75       cpu_accumulated_time_stat.StdDev();
     76   stddev_data->bytes_per_second = bytes_per_second_stat.StdDev();
     77   stddev_data->items_per_second = items_per_second_stat.StdDev();
     78 }
     79 
     80 void BenchmarkReporter::Finalize() {
     81 }
     82 
     83 BenchmarkReporter::~BenchmarkReporter() {
     84 }
     85 
     86 } // end namespace benchmark
     87