mirror of
https://github.com/google/benchmark.git
synced 2024-11-26 16:31:54 +00:00
7d97a057e1
While current counters can e.g. answer the question "how many items is processed per second", it is impossible to get it to tell "how many seconds it takes to process a single item". The solution is to add a yet another modifier `kInvert`, that is *always* considered last, which simply inverts the answer. Fixes #781, #830, #848.
81 lines
2.1 KiB
C++
81 lines
2.1 KiB
C++
// 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.
|
|
|
|
#include "counter.h"
|
|
|
|
namespace benchmark {
|
|
namespace internal {
|
|
|
|
double Finish(Counter const& c, IterationCount iterations, double cpu_time,
|
|
double num_threads) {
|
|
double v = c.value;
|
|
if (c.flags & Counter::kIsRate) {
|
|
v /= cpu_time;
|
|
}
|
|
if (c.flags & Counter::kAvgThreads) {
|
|
v /= num_threads;
|
|
}
|
|
if (c.flags & Counter::kIsIterationInvariant) {
|
|
v *= iterations;
|
|
}
|
|
if (c.flags & Counter::kAvgIterations) {
|
|
v /= iterations;
|
|
}
|
|
|
|
if (c.flags & Counter::kInvert) { // Invert is *always* last.
|
|
v = 1.0 / v;
|
|
}
|
|
return v;
|
|
}
|
|
|
|
void Finish(UserCounters* l, IterationCount iterations, double cpu_time,
|
|
double num_threads) {
|
|
for (auto& c : *l) {
|
|
c.second.value = Finish(c.second, iterations, cpu_time, num_threads);
|
|
}
|
|
}
|
|
|
|
void Increment(UserCounters* l, UserCounters const& r) {
|
|
// add counters present in both or just in *l
|
|
for (auto& c : *l) {
|
|
auto it = r.find(c.first);
|
|
if (it != r.end()) {
|
|
c.second.value = c.second + it->second;
|
|
}
|
|
}
|
|
// add counters present in r, but not in *l
|
|
for (auto const& tc : r) {
|
|
auto it = l->find(tc.first);
|
|
if (it == l->end()) {
|
|
(*l)[tc.first] = tc.second;
|
|
}
|
|
}
|
|
}
|
|
|
|
bool SameNames(UserCounters const& l, UserCounters const& r) {
|
|
if (&l == &r) return true;
|
|
if (l.size() != r.size()) {
|
|
return false;
|
|
}
|
|
for (auto const& c : l) {
|
|
if (r.find(c.first) == r.end()) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
} // end namespace internal
|
|
} // end namespace benchmark
|