1*dbb99499SAndroid Build Coastguard Worker // Copyright 2015 Google Inc. All rights reserved.
2*dbb99499SAndroid Build Coastguard Worker //
3*dbb99499SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*dbb99499SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*dbb99499SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*dbb99499SAndroid Build Coastguard Worker //
7*dbb99499SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0
8*dbb99499SAndroid Build Coastguard Worker //
9*dbb99499SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*dbb99499SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*dbb99499SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*dbb99499SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*dbb99499SAndroid Build Coastguard Worker // limitations under the License.
14*dbb99499SAndroid Build Coastguard Worker
15*dbb99499SAndroid Build Coastguard Worker // Support for registering benchmarks for functions.
16*dbb99499SAndroid Build Coastguard Worker
17*dbb99499SAndroid Build Coastguard Worker /* Example usage:
18*dbb99499SAndroid Build Coastguard Worker // Define a function that executes the code to be measured a
19*dbb99499SAndroid Build Coastguard Worker // specified number of times:
20*dbb99499SAndroid Build Coastguard Worker static void BM_StringCreation(benchmark::State& state) {
21*dbb99499SAndroid Build Coastguard Worker for (auto _ : state)
22*dbb99499SAndroid Build Coastguard Worker std::string empty_string;
23*dbb99499SAndroid Build Coastguard Worker }
24*dbb99499SAndroid Build Coastguard Worker
25*dbb99499SAndroid Build Coastguard Worker // Register the function as a benchmark
26*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_StringCreation);
27*dbb99499SAndroid Build Coastguard Worker
28*dbb99499SAndroid Build Coastguard Worker // Define another benchmark
29*dbb99499SAndroid Build Coastguard Worker static void BM_StringCopy(benchmark::State& state) {
30*dbb99499SAndroid Build Coastguard Worker std::string x = "hello";
31*dbb99499SAndroid Build Coastguard Worker for (auto _ : state)
32*dbb99499SAndroid Build Coastguard Worker std::string copy(x);
33*dbb99499SAndroid Build Coastguard Worker }
34*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_StringCopy);
35*dbb99499SAndroid Build Coastguard Worker
36*dbb99499SAndroid Build Coastguard Worker // Augment the main() program to invoke benchmarks if specified
37*dbb99499SAndroid Build Coastguard Worker // via the --benchmark_filter command line flag. E.g.,
38*dbb99499SAndroid Build Coastguard Worker // my_unittest --benchmark_filter=all
39*dbb99499SAndroid Build Coastguard Worker // my_unittest --benchmark_filter=BM_StringCreation
40*dbb99499SAndroid Build Coastguard Worker // my_unittest --benchmark_filter=String
41*dbb99499SAndroid Build Coastguard Worker // my_unittest --benchmark_filter='Copy|Creation'
42*dbb99499SAndroid Build Coastguard Worker int main(int argc, char** argv) {
43*dbb99499SAndroid Build Coastguard Worker benchmark::Initialize(&argc, argv);
44*dbb99499SAndroid Build Coastguard Worker benchmark::RunSpecifiedBenchmarks();
45*dbb99499SAndroid Build Coastguard Worker benchmark::Shutdown();
46*dbb99499SAndroid Build Coastguard Worker return 0;
47*dbb99499SAndroid Build Coastguard Worker }
48*dbb99499SAndroid Build Coastguard Worker
49*dbb99499SAndroid Build Coastguard Worker // Sometimes a family of microbenchmarks can be implemented with
50*dbb99499SAndroid Build Coastguard Worker // just one routine that takes an extra argument to specify which
51*dbb99499SAndroid Build Coastguard Worker // one of the family of benchmarks to run. For example, the following
52*dbb99499SAndroid Build Coastguard Worker // code defines a family of microbenchmarks for measuring the speed
53*dbb99499SAndroid Build Coastguard Worker // of memcpy() calls of different lengths:
54*dbb99499SAndroid Build Coastguard Worker
55*dbb99499SAndroid Build Coastguard Worker static void BM_memcpy(benchmark::State& state) {
56*dbb99499SAndroid Build Coastguard Worker char* src = new char[state.range(0)]; char* dst = new char[state.range(0)];
57*dbb99499SAndroid Build Coastguard Worker memset(src, 'x', state.range(0));
58*dbb99499SAndroid Build Coastguard Worker for (auto _ : state)
59*dbb99499SAndroid Build Coastguard Worker memcpy(dst, src, state.range(0));
60*dbb99499SAndroid Build Coastguard Worker state.SetBytesProcessed(state.iterations() * state.range(0));
61*dbb99499SAndroid Build Coastguard Worker delete[] src; delete[] dst;
62*dbb99499SAndroid Build Coastguard Worker }
63*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_memcpy)->Arg(8)->Arg(64)->Arg(512)->Arg(1<<10)->Arg(8<<10);
64*dbb99499SAndroid Build Coastguard Worker
65*dbb99499SAndroid Build Coastguard Worker // The preceding code is quite repetitive, and can be replaced with the
66*dbb99499SAndroid Build Coastguard Worker // following short-hand. The following invocation will pick a few
67*dbb99499SAndroid Build Coastguard Worker // appropriate arguments in the specified range and will generate a
68*dbb99499SAndroid Build Coastguard Worker // microbenchmark for each such argument.
69*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_memcpy)->Range(8, 8<<10);
70*dbb99499SAndroid Build Coastguard Worker
71*dbb99499SAndroid Build Coastguard Worker // You might have a microbenchmark that depends on two inputs. For
72*dbb99499SAndroid Build Coastguard Worker // example, the following code defines a family of microbenchmarks for
73*dbb99499SAndroid Build Coastguard Worker // measuring the speed of set insertion.
74*dbb99499SAndroid Build Coastguard Worker static void BM_SetInsert(benchmark::State& state) {
75*dbb99499SAndroid Build Coastguard Worker set<int> data;
76*dbb99499SAndroid Build Coastguard Worker for (auto _ : state) {
77*dbb99499SAndroid Build Coastguard Worker state.PauseTiming();
78*dbb99499SAndroid Build Coastguard Worker data = ConstructRandomSet(state.range(0));
79*dbb99499SAndroid Build Coastguard Worker state.ResumeTiming();
80*dbb99499SAndroid Build Coastguard Worker for (int j = 0; j < state.range(1); ++j)
81*dbb99499SAndroid Build Coastguard Worker data.insert(RandomNumber());
82*dbb99499SAndroid Build Coastguard Worker }
83*dbb99499SAndroid Build Coastguard Worker }
84*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_SetInsert)
85*dbb99499SAndroid Build Coastguard Worker ->Args({1<<10, 128})
86*dbb99499SAndroid Build Coastguard Worker ->Args({2<<10, 128})
87*dbb99499SAndroid Build Coastguard Worker ->Args({4<<10, 128})
88*dbb99499SAndroid Build Coastguard Worker ->Args({8<<10, 128})
89*dbb99499SAndroid Build Coastguard Worker ->Args({1<<10, 512})
90*dbb99499SAndroid Build Coastguard Worker ->Args({2<<10, 512})
91*dbb99499SAndroid Build Coastguard Worker ->Args({4<<10, 512})
92*dbb99499SAndroid Build Coastguard Worker ->Args({8<<10, 512});
93*dbb99499SAndroid Build Coastguard Worker
94*dbb99499SAndroid Build Coastguard Worker // The preceding code is quite repetitive, and can be replaced with
95*dbb99499SAndroid Build Coastguard Worker // the following short-hand. The following macro will pick a few
96*dbb99499SAndroid Build Coastguard Worker // appropriate arguments in the product of the two specified ranges
97*dbb99499SAndroid Build Coastguard Worker // and will generate a microbenchmark for each such pair.
98*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_SetInsert)->Ranges({{1<<10, 8<<10}, {128, 512}});
99*dbb99499SAndroid Build Coastguard Worker
100*dbb99499SAndroid Build Coastguard Worker // For more complex patterns of inputs, passing a custom function
101*dbb99499SAndroid Build Coastguard Worker // to Apply allows programmatic specification of an
102*dbb99499SAndroid Build Coastguard Worker // arbitrary set of arguments to run the microbenchmark on.
103*dbb99499SAndroid Build Coastguard Worker // The following example enumerates a dense range on
104*dbb99499SAndroid Build Coastguard Worker // one parameter, and a sparse range on the second.
105*dbb99499SAndroid Build Coastguard Worker static void CustomArguments(benchmark::internal::Benchmark* b) {
106*dbb99499SAndroid Build Coastguard Worker for (int i = 0; i <= 10; ++i)
107*dbb99499SAndroid Build Coastguard Worker for (int j = 32; j <= 1024*1024; j *= 8)
108*dbb99499SAndroid Build Coastguard Worker b->Args({i, j});
109*dbb99499SAndroid Build Coastguard Worker }
110*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_SetInsert)->Apply(CustomArguments);
111*dbb99499SAndroid Build Coastguard Worker
112*dbb99499SAndroid Build Coastguard Worker // Templated microbenchmarks work the same way:
113*dbb99499SAndroid Build Coastguard Worker // Produce then consume 'size' messages 'iters' times
114*dbb99499SAndroid Build Coastguard Worker // Measures throughput in the absence of multiprogramming.
115*dbb99499SAndroid Build Coastguard Worker template <class Q> int BM_Sequential(benchmark::State& state) {
116*dbb99499SAndroid Build Coastguard Worker Q q;
117*dbb99499SAndroid Build Coastguard Worker typename Q::value_type v;
118*dbb99499SAndroid Build Coastguard Worker for (auto _ : state) {
119*dbb99499SAndroid Build Coastguard Worker for (int i = state.range(0); i--; )
120*dbb99499SAndroid Build Coastguard Worker q.push(v);
121*dbb99499SAndroid Build Coastguard Worker for (int e = state.range(0); e--; )
122*dbb99499SAndroid Build Coastguard Worker q.Wait(&v);
123*dbb99499SAndroid Build Coastguard Worker }
124*dbb99499SAndroid Build Coastguard Worker // actually messages, not bytes:
125*dbb99499SAndroid Build Coastguard Worker state.SetBytesProcessed(state.iterations() * state.range(0));
126*dbb99499SAndroid Build Coastguard Worker }
127*dbb99499SAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_Sequential, WaitQueue<int>)->Range(1<<0, 1<<10);
128*dbb99499SAndroid Build Coastguard Worker
129*dbb99499SAndroid Build Coastguard Worker Use `Benchmark::MinTime(double t)` to set the minimum time used to run the
130*dbb99499SAndroid Build Coastguard Worker benchmark. This option overrides the `benchmark_min_time` flag.
131*dbb99499SAndroid Build Coastguard Worker
132*dbb99499SAndroid Build Coastguard Worker void BM_test(benchmark::State& state) {
133*dbb99499SAndroid Build Coastguard Worker ... body ...
134*dbb99499SAndroid Build Coastguard Worker }
135*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_test)->MinTime(2.0); // Run for at least 2 seconds.
136*dbb99499SAndroid Build Coastguard Worker
137*dbb99499SAndroid Build Coastguard Worker In a multithreaded test, it is guaranteed that none of the threads will start
138*dbb99499SAndroid Build Coastguard Worker until all have reached the loop start, and all will have finished before any
139*dbb99499SAndroid Build Coastguard Worker thread exits the loop body. As such, any global setup or teardown you want to
140*dbb99499SAndroid Build Coastguard Worker do can be wrapped in a check against the thread index:
141*dbb99499SAndroid Build Coastguard Worker
142*dbb99499SAndroid Build Coastguard Worker static void BM_MultiThreaded(benchmark::State& state) {
143*dbb99499SAndroid Build Coastguard Worker if (state.thread_index() == 0) {
144*dbb99499SAndroid Build Coastguard Worker // Setup code here.
145*dbb99499SAndroid Build Coastguard Worker }
146*dbb99499SAndroid Build Coastguard Worker for (auto _ : state) {
147*dbb99499SAndroid Build Coastguard Worker // Run the test as normal.
148*dbb99499SAndroid Build Coastguard Worker }
149*dbb99499SAndroid Build Coastguard Worker if (state.thread_index() == 0) {
150*dbb99499SAndroid Build Coastguard Worker // Teardown code here.
151*dbb99499SAndroid Build Coastguard Worker }
152*dbb99499SAndroid Build Coastguard Worker }
153*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MultiThreaded)->Threads(4);
154*dbb99499SAndroid Build Coastguard Worker
155*dbb99499SAndroid Build Coastguard Worker
156*dbb99499SAndroid Build Coastguard Worker If a benchmark runs a few milliseconds it may be hard to visually compare the
157*dbb99499SAndroid Build Coastguard Worker measured times, since the output data is given in nanoseconds per default. In
158*dbb99499SAndroid Build Coastguard Worker order to manually set the time unit, you can specify it manually:
159*dbb99499SAndroid Build Coastguard Worker
160*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_test)->Unit(benchmark::kMillisecond);
161*dbb99499SAndroid Build Coastguard Worker */
162*dbb99499SAndroid Build Coastguard Worker
163*dbb99499SAndroid Build Coastguard Worker #ifndef BENCHMARK_BENCHMARK_H_
164*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_BENCHMARK_H_
165*dbb99499SAndroid Build Coastguard Worker
166*dbb99499SAndroid Build Coastguard Worker // The _MSVC_LANG check should detect Visual Studio 2015 Update 3 and newer.
167*dbb99499SAndroid Build Coastguard Worker #if __cplusplus >= 201103L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201103L)
168*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_HAS_CXX11
169*dbb99499SAndroid Build Coastguard Worker #endif
170*dbb99499SAndroid Build Coastguard Worker
171*dbb99499SAndroid Build Coastguard Worker // This _MSC_VER check should detect VS 2017 v15.3 and newer.
172*dbb99499SAndroid Build Coastguard Worker #if __cplusplus >= 201703L || \
173*dbb99499SAndroid Build Coastguard Worker (defined(_MSC_VER) && _MSC_VER >= 1911 && _MSVC_LANG >= 201703L)
174*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_HAS_CXX17
175*dbb99499SAndroid Build Coastguard Worker #endif
176*dbb99499SAndroid Build Coastguard Worker
177*dbb99499SAndroid Build Coastguard Worker #include <stdint.h>
178*dbb99499SAndroid Build Coastguard Worker
179*dbb99499SAndroid Build Coastguard Worker #include <algorithm>
180*dbb99499SAndroid Build Coastguard Worker #include <cassert>
181*dbb99499SAndroid Build Coastguard Worker #include <cstddef>
182*dbb99499SAndroid Build Coastguard Worker #include <iosfwd>
183*dbb99499SAndroid Build Coastguard Worker #include <limits>
184*dbb99499SAndroid Build Coastguard Worker #include <map>
185*dbb99499SAndroid Build Coastguard Worker #include <set>
186*dbb99499SAndroid Build Coastguard Worker #include <string>
187*dbb99499SAndroid Build Coastguard Worker #include <utility>
188*dbb99499SAndroid Build Coastguard Worker #include <vector>
189*dbb99499SAndroid Build Coastguard Worker
190*dbb99499SAndroid Build Coastguard Worker #include "benchmark/export.h"
191*dbb99499SAndroid Build Coastguard Worker
192*dbb99499SAndroid Build Coastguard Worker #if defined(BENCHMARK_HAS_CXX11)
193*dbb99499SAndroid Build Coastguard Worker #include <atomic>
194*dbb99499SAndroid Build Coastguard Worker #include <initializer_list>
195*dbb99499SAndroid Build Coastguard Worker #include <type_traits>
196*dbb99499SAndroid Build Coastguard Worker #include <utility>
197*dbb99499SAndroid Build Coastguard Worker #endif
198*dbb99499SAndroid Build Coastguard Worker
199*dbb99499SAndroid Build Coastguard Worker #if defined(_MSC_VER)
200*dbb99499SAndroid Build Coastguard Worker #include <intrin.h> // for _ReadWriteBarrier
201*dbb99499SAndroid Build Coastguard Worker #endif
202*dbb99499SAndroid Build Coastguard Worker
203*dbb99499SAndroid Build Coastguard Worker #ifndef BENCHMARK_HAS_CXX11
204*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_DISALLOW_COPY_AND_ASSIGN(TypeName) \
205*dbb99499SAndroid Build Coastguard Worker TypeName(const TypeName&); \
206*dbb99499SAndroid Build Coastguard Worker TypeName& operator=(const TypeName&)
207*dbb99499SAndroid Build Coastguard Worker #else
208*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_DISALLOW_COPY_AND_ASSIGN(TypeName) \
209*dbb99499SAndroid Build Coastguard Worker TypeName(const TypeName&) = delete; \
210*dbb99499SAndroid Build Coastguard Worker TypeName& operator=(const TypeName&) = delete
211*dbb99499SAndroid Build Coastguard Worker #endif
212*dbb99499SAndroid Build Coastguard Worker
213*dbb99499SAndroid Build Coastguard Worker #ifdef BENCHMARK_HAS_CXX17
214*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_UNUSED [[maybe_unused]]
215*dbb99499SAndroid Build Coastguard Worker #elif defined(__GNUC__) || defined(__clang__)
216*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_UNUSED __attribute__((unused))
217*dbb99499SAndroid Build Coastguard Worker #else
218*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_UNUSED
219*dbb99499SAndroid Build Coastguard Worker #endif
220*dbb99499SAndroid Build Coastguard Worker
221*dbb99499SAndroid Build Coastguard Worker // Used to annotate functions, methods and classes so they
222*dbb99499SAndroid Build Coastguard Worker // are not optimized by the compiler. Useful for tests
223*dbb99499SAndroid Build Coastguard Worker // where you expect loops to stay in place churning cycles
224*dbb99499SAndroid Build Coastguard Worker #if defined(__clang__)
225*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_DONT_OPTIMIZE __attribute__((optnone))
226*dbb99499SAndroid Build Coastguard Worker #elif defined(__GNUC__) || defined(__GNUG__)
227*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_DONT_OPTIMIZE __attribute__((optimize(0)))
228*dbb99499SAndroid Build Coastguard Worker #else
229*dbb99499SAndroid Build Coastguard Worker // MSVC & Intel do not have a no-optimize attribute, only line pragmas
230*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_DONT_OPTIMIZE
231*dbb99499SAndroid Build Coastguard Worker #endif
232*dbb99499SAndroid Build Coastguard Worker
233*dbb99499SAndroid Build Coastguard Worker #if defined(__GNUC__) || defined(__clang__)
234*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_ALWAYS_INLINE __attribute__((always_inline))
235*dbb99499SAndroid Build Coastguard Worker #elif defined(_MSC_VER) && !defined(__clang__)
236*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_ALWAYS_INLINE __forceinline
237*dbb99499SAndroid Build Coastguard Worker #define __func__ __FUNCTION__
238*dbb99499SAndroid Build Coastguard Worker #else
239*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_ALWAYS_INLINE
240*dbb99499SAndroid Build Coastguard Worker #endif
241*dbb99499SAndroid Build Coastguard Worker
242*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_INTERNAL_TOSTRING2(x) #x
243*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_INTERNAL_TOSTRING(x) BENCHMARK_INTERNAL_TOSTRING2(x)
244*dbb99499SAndroid Build Coastguard Worker
245*dbb99499SAndroid Build Coastguard Worker // clang-format off
246*dbb99499SAndroid Build Coastguard Worker #if (defined(__GNUC__) && !defined(__NVCC__) && !defined(__NVCOMPILER)) || defined(__clang__)
247*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_BUILTIN_EXPECT(x, y) __builtin_expect(x, y)
248*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_DEPRECATED_MSG(msg) __attribute__((deprecated(msg)))
249*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_DISABLE_DEPRECATED_WARNING \
250*dbb99499SAndroid Build Coastguard Worker _Pragma("GCC diagnostic push") \
251*dbb99499SAndroid Build Coastguard Worker _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
252*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_RESTORE_DEPRECATED_WARNING _Pragma("GCC diagnostic pop")
253*dbb99499SAndroid Build Coastguard Worker #elif defined(__NVCOMPILER)
254*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_BUILTIN_EXPECT(x, y) __builtin_expect(x, y)
255*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_DEPRECATED_MSG(msg) __attribute__((deprecated(msg)))
256*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_DISABLE_DEPRECATED_WARNING \
257*dbb99499SAndroid Build Coastguard Worker _Pragma("diagnostic push") \
258*dbb99499SAndroid Build Coastguard Worker _Pragma("diag_suppress deprecated_entity_with_custom_message")
259*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_RESTORE_DEPRECATED_WARNING _Pragma("diagnostic pop")
260*dbb99499SAndroid Build Coastguard Worker #else
261*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_BUILTIN_EXPECT(x, y) x
262*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_DEPRECATED_MSG(msg)
263*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_WARNING_MSG(msg) \
264*dbb99499SAndroid Build Coastguard Worker __pragma(message(__FILE__ "(" BENCHMARK_INTERNAL_TOSTRING( \
265*dbb99499SAndroid Build Coastguard Worker __LINE__) ") : warning note: " msg))
266*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_DISABLE_DEPRECATED_WARNING
267*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_RESTORE_DEPRECATED_WARNING
268*dbb99499SAndroid Build Coastguard Worker #endif
269*dbb99499SAndroid Build Coastguard Worker // clang-format on
270*dbb99499SAndroid Build Coastguard Worker
271*dbb99499SAndroid Build Coastguard Worker #if defined(__GNUC__) && !defined(__clang__)
272*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
273*dbb99499SAndroid Build Coastguard Worker #endif
274*dbb99499SAndroid Build Coastguard Worker
275*dbb99499SAndroid Build Coastguard Worker #ifndef __has_builtin
276*dbb99499SAndroid Build Coastguard Worker #define __has_builtin(x) 0
277*dbb99499SAndroid Build Coastguard Worker #endif
278*dbb99499SAndroid Build Coastguard Worker
279*dbb99499SAndroid Build Coastguard Worker #if defined(__GNUC__) || __has_builtin(__builtin_unreachable)
280*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_UNREACHABLE() __builtin_unreachable()
281*dbb99499SAndroid Build Coastguard Worker #elif defined(_MSC_VER)
282*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_UNREACHABLE() __assume(false)
283*dbb99499SAndroid Build Coastguard Worker #else
284*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_UNREACHABLE() ((void)0)
285*dbb99499SAndroid Build Coastguard Worker #endif
286*dbb99499SAndroid Build Coastguard Worker
287*dbb99499SAndroid Build Coastguard Worker #ifdef BENCHMARK_HAS_CXX11
288*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_OVERRIDE override
289*dbb99499SAndroid Build Coastguard Worker #else
290*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_OVERRIDE
291*dbb99499SAndroid Build Coastguard Worker #endif
292*dbb99499SAndroid Build Coastguard Worker
293*dbb99499SAndroid Build Coastguard Worker #if defined(_MSC_VER)
294*dbb99499SAndroid Build Coastguard Worker #pragma warning(push)
295*dbb99499SAndroid Build Coastguard Worker // C4251: <symbol> needs to have dll-interface to be used by clients of class
296*dbb99499SAndroid Build Coastguard Worker #pragma warning(disable : 4251)
297*dbb99499SAndroid Build Coastguard Worker #endif
298*dbb99499SAndroid Build Coastguard Worker
299*dbb99499SAndroid Build Coastguard Worker namespace benchmark {
300*dbb99499SAndroid Build Coastguard Worker class BenchmarkReporter;
301*dbb99499SAndroid Build Coastguard Worker
302*dbb99499SAndroid Build Coastguard Worker // Default number of minimum benchmark running time in seconds.
303*dbb99499SAndroid Build Coastguard Worker const char kDefaultMinTimeStr[] = "0.5s";
304*dbb99499SAndroid Build Coastguard Worker
305*dbb99499SAndroid Build Coastguard Worker // Returns the version of the library.
306*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT std::string GetBenchmarkVersion();
307*dbb99499SAndroid Build Coastguard Worker
308*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT void PrintDefaultHelp();
309*dbb99499SAndroid Build Coastguard Worker
310*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT void Initialize(int* argc, char** argv,
311*dbb99499SAndroid Build Coastguard Worker void (*HelperPrinterf)() = PrintDefaultHelp);
312*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT void Shutdown();
313*dbb99499SAndroid Build Coastguard Worker
314*dbb99499SAndroid Build Coastguard Worker // Report to stdout all arguments in 'argv' as unrecognized except the first.
315*dbb99499SAndroid Build Coastguard Worker // Returns true there is at least on unrecognized argument (i.e. 'argc' > 1).
316*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT bool ReportUnrecognizedArguments(int argc, char** argv);
317*dbb99499SAndroid Build Coastguard Worker
318*dbb99499SAndroid Build Coastguard Worker // Returns the current value of --benchmark_filter.
319*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT std::string GetBenchmarkFilter();
320*dbb99499SAndroid Build Coastguard Worker
321*dbb99499SAndroid Build Coastguard Worker // Sets a new value to --benchmark_filter. (This will override this flag's
322*dbb99499SAndroid Build Coastguard Worker // current value).
323*dbb99499SAndroid Build Coastguard Worker // Should be called after `benchmark::Initialize()`, as
324*dbb99499SAndroid Build Coastguard Worker // `benchmark::Initialize()` will override the flag's value.
325*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT void SetBenchmarkFilter(std::string value);
326*dbb99499SAndroid Build Coastguard Worker
327*dbb99499SAndroid Build Coastguard Worker // Returns the current value of --v (command line value for verbosity).
328*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT int32_t GetBenchmarkVerbosity();
329*dbb99499SAndroid Build Coastguard Worker
330*dbb99499SAndroid Build Coastguard Worker // Creates a default display reporter. Used by the library when no display
331*dbb99499SAndroid Build Coastguard Worker // reporter is provided, but also made available for external use in case a
332*dbb99499SAndroid Build Coastguard Worker // custom reporter should respect the `--benchmark_format` flag as a fallback
333*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT BenchmarkReporter* CreateDefaultDisplayReporter();
334*dbb99499SAndroid Build Coastguard Worker
335*dbb99499SAndroid Build Coastguard Worker // Generate a list of benchmarks matching the specified --benchmark_filter flag
336*dbb99499SAndroid Build Coastguard Worker // and if --benchmark_list_tests is specified return after printing the name
337*dbb99499SAndroid Build Coastguard Worker // of each matching benchmark. Otherwise run each matching benchmark and
338*dbb99499SAndroid Build Coastguard Worker // report the results.
339*dbb99499SAndroid Build Coastguard Worker //
340*dbb99499SAndroid Build Coastguard Worker // spec : Specify the benchmarks to run. If users do not specify this arg,
341*dbb99499SAndroid Build Coastguard Worker // then the value of FLAGS_benchmark_filter
342*dbb99499SAndroid Build Coastguard Worker // will be used.
343*dbb99499SAndroid Build Coastguard Worker //
344*dbb99499SAndroid Build Coastguard Worker // The second and third overload use the specified 'display_reporter' and
345*dbb99499SAndroid Build Coastguard Worker // 'file_reporter' respectively. 'file_reporter' will write to the file
346*dbb99499SAndroid Build Coastguard Worker // specified
347*dbb99499SAndroid Build Coastguard Worker // by '--benchmark_out'. If '--benchmark_out' is not given the
348*dbb99499SAndroid Build Coastguard Worker // 'file_reporter' is ignored.
349*dbb99499SAndroid Build Coastguard Worker //
350*dbb99499SAndroid Build Coastguard Worker // RETURNS: The number of matching benchmarks.
351*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT size_t RunSpecifiedBenchmarks();
352*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT size_t RunSpecifiedBenchmarks(std::string spec);
353*dbb99499SAndroid Build Coastguard Worker
354*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT size_t
355*dbb99499SAndroid Build Coastguard Worker RunSpecifiedBenchmarks(BenchmarkReporter* display_reporter);
356*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT size_t
357*dbb99499SAndroid Build Coastguard Worker RunSpecifiedBenchmarks(BenchmarkReporter* display_reporter, std::string spec);
358*dbb99499SAndroid Build Coastguard Worker
359*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT size_t RunSpecifiedBenchmarks(
360*dbb99499SAndroid Build Coastguard Worker BenchmarkReporter* display_reporter, BenchmarkReporter* file_reporter);
361*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT size_t
362*dbb99499SAndroid Build Coastguard Worker RunSpecifiedBenchmarks(BenchmarkReporter* display_reporter,
363*dbb99499SAndroid Build Coastguard Worker BenchmarkReporter* file_reporter, std::string spec);
364*dbb99499SAndroid Build Coastguard Worker
365*dbb99499SAndroid Build Coastguard Worker // TimeUnit is passed to a benchmark in order to specify the order of magnitude
366*dbb99499SAndroid Build Coastguard Worker // for the measured time.
367*dbb99499SAndroid Build Coastguard Worker enum TimeUnit { kNanosecond, kMicrosecond, kMillisecond, kSecond };
368*dbb99499SAndroid Build Coastguard Worker
369*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT TimeUnit GetDefaultTimeUnit();
370*dbb99499SAndroid Build Coastguard Worker
371*dbb99499SAndroid Build Coastguard Worker // Sets the default time unit the benchmarks use
372*dbb99499SAndroid Build Coastguard Worker // Has to be called before the benchmark loop to take effect
373*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT void SetDefaultTimeUnit(TimeUnit unit);
374*dbb99499SAndroid Build Coastguard Worker
375*dbb99499SAndroid Build Coastguard Worker // If a MemoryManager is registered (via RegisterMemoryManager()),
376*dbb99499SAndroid Build Coastguard Worker // it can be used to collect and report allocation metrics for a run of the
377*dbb99499SAndroid Build Coastguard Worker // benchmark.
378*dbb99499SAndroid Build Coastguard Worker class MemoryManager {
379*dbb99499SAndroid Build Coastguard Worker public:
380*dbb99499SAndroid Build Coastguard Worker static const int64_t TombstoneValue;
381*dbb99499SAndroid Build Coastguard Worker
382*dbb99499SAndroid Build Coastguard Worker struct Result {
ResultResult383*dbb99499SAndroid Build Coastguard Worker Result()
384*dbb99499SAndroid Build Coastguard Worker : num_allocs(0),
385*dbb99499SAndroid Build Coastguard Worker max_bytes_used(0),
386*dbb99499SAndroid Build Coastguard Worker total_allocated_bytes(TombstoneValue),
387*dbb99499SAndroid Build Coastguard Worker net_heap_growth(TombstoneValue) {}
388*dbb99499SAndroid Build Coastguard Worker
389*dbb99499SAndroid Build Coastguard Worker // The number of allocations made in total between Start and Stop.
390*dbb99499SAndroid Build Coastguard Worker int64_t num_allocs;
391*dbb99499SAndroid Build Coastguard Worker
392*dbb99499SAndroid Build Coastguard Worker // The peak memory use between Start and Stop.
393*dbb99499SAndroid Build Coastguard Worker int64_t max_bytes_used;
394*dbb99499SAndroid Build Coastguard Worker
395*dbb99499SAndroid Build Coastguard Worker // The total memory allocated, in bytes, between Start and Stop.
396*dbb99499SAndroid Build Coastguard Worker // Init'ed to TombstoneValue if metric not available.
397*dbb99499SAndroid Build Coastguard Worker int64_t total_allocated_bytes;
398*dbb99499SAndroid Build Coastguard Worker
399*dbb99499SAndroid Build Coastguard Worker // The net changes in memory, in bytes, between Start and Stop.
400*dbb99499SAndroid Build Coastguard Worker // ie., total_allocated_bytes - total_deallocated_bytes.
401*dbb99499SAndroid Build Coastguard Worker // Init'ed to TombstoneValue if metric not available.
402*dbb99499SAndroid Build Coastguard Worker int64_t net_heap_growth;
403*dbb99499SAndroid Build Coastguard Worker };
404*dbb99499SAndroid Build Coastguard Worker
~MemoryManager()405*dbb99499SAndroid Build Coastguard Worker virtual ~MemoryManager() {}
406*dbb99499SAndroid Build Coastguard Worker
407*dbb99499SAndroid Build Coastguard Worker // Implement this to start recording allocation information.
408*dbb99499SAndroid Build Coastguard Worker virtual void Start() = 0;
409*dbb99499SAndroid Build Coastguard Worker
410*dbb99499SAndroid Build Coastguard Worker // Implement this to stop recording and fill out the given Result structure.
411*dbb99499SAndroid Build Coastguard Worker virtual void Stop(Result& result) = 0;
412*dbb99499SAndroid Build Coastguard Worker };
413*dbb99499SAndroid Build Coastguard Worker
414*dbb99499SAndroid Build Coastguard Worker // Register a MemoryManager instance that will be used to collect and report
415*dbb99499SAndroid Build Coastguard Worker // allocation measurements for benchmark runs.
416*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT
417*dbb99499SAndroid Build Coastguard Worker void RegisterMemoryManager(MemoryManager* memory_manager);
418*dbb99499SAndroid Build Coastguard Worker
419*dbb99499SAndroid Build Coastguard Worker // If a ProfilerManager is registered (via RegisterProfilerManager()), the
420*dbb99499SAndroid Build Coastguard Worker // benchmark will be run an additional time under the profiler to collect and
421*dbb99499SAndroid Build Coastguard Worker // report profile metrics for the run of the benchmark.
422*dbb99499SAndroid Build Coastguard Worker class ProfilerManager {
423*dbb99499SAndroid Build Coastguard Worker public:
~ProfilerManager()424*dbb99499SAndroid Build Coastguard Worker virtual ~ProfilerManager() {}
425*dbb99499SAndroid Build Coastguard Worker
426*dbb99499SAndroid Build Coastguard Worker // This is called after `Setup()` code and right before the benchmark is run.
427*dbb99499SAndroid Build Coastguard Worker virtual void AfterSetupStart() = 0;
428*dbb99499SAndroid Build Coastguard Worker
429*dbb99499SAndroid Build Coastguard Worker // This is called before `Teardown()` code and right after the benchmark
430*dbb99499SAndroid Build Coastguard Worker // completes.
431*dbb99499SAndroid Build Coastguard Worker virtual void BeforeTeardownStop() = 0;
432*dbb99499SAndroid Build Coastguard Worker };
433*dbb99499SAndroid Build Coastguard Worker
434*dbb99499SAndroid Build Coastguard Worker // Register a ProfilerManager instance that will be used to collect and report
435*dbb99499SAndroid Build Coastguard Worker // profile measurements for benchmark runs.
436*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT
437*dbb99499SAndroid Build Coastguard Worker void RegisterProfilerManager(ProfilerManager* profiler_manager);
438*dbb99499SAndroid Build Coastguard Worker
439*dbb99499SAndroid Build Coastguard Worker // Add a key-value pair to output as part of the context stanza in the report.
440*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT
441*dbb99499SAndroid Build Coastguard Worker void AddCustomContext(const std::string& key, const std::string& value);
442*dbb99499SAndroid Build Coastguard Worker
443*dbb99499SAndroid Build Coastguard Worker namespace internal {
444*dbb99499SAndroid Build Coastguard Worker class Benchmark;
445*dbb99499SAndroid Build Coastguard Worker class BenchmarkImp;
446*dbb99499SAndroid Build Coastguard Worker class BenchmarkFamilies;
447*dbb99499SAndroid Build Coastguard Worker
448*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT std::map<std::string, std::string>*& GetGlobalContext();
449*dbb99499SAndroid Build Coastguard Worker
450*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT
451*dbb99499SAndroid Build Coastguard Worker void UseCharPointer(char const volatile*);
452*dbb99499SAndroid Build Coastguard Worker
453*dbb99499SAndroid Build Coastguard Worker // Take ownership of the pointer and register the benchmark. Return the
454*dbb99499SAndroid Build Coastguard Worker // registered benchmark.
455*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT Benchmark* RegisterBenchmarkInternal(Benchmark*);
456*dbb99499SAndroid Build Coastguard Worker
457*dbb99499SAndroid Build Coastguard Worker // Ensure that the standard streams are properly initialized in every TU.
458*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT int InitializeStreams();
459*dbb99499SAndroid Build Coastguard Worker BENCHMARK_UNUSED static int stream_init_anchor = InitializeStreams();
460*dbb99499SAndroid Build Coastguard Worker
461*dbb99499SAndroid Build Coastguard Worker } // namespace internal
462*dbb99499SAndroid Build Coastguard Worker
463*dbb99499SAndroid Build Coastguard Worker #if (!defined(__GNUC__) && !defined(__clang__)) || defined(__pnacl__) || \
464*dbb99499SAndroid Build Coastguard Worker defined(__EMSCRIPTEN__)
465*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_HAS_NO_INLINE_ASSEMBLY
466*dbb99499SAndroid Build Coastguard Worker #endif
467*dbb99499SAndroid Build Coastguard Worker
468*dbb99499SAndroid Build Coastguard Worker // Force the compiler to flush pending writes to global memory. Acts as an
469*dbb99499SAndroid Build Coastguard Worker // effective read/write barrier
470*dbb99499SAndroid Build Coastguard Worker #ifdef BENCHMARK_HAS_CXX11
ClobberMemory()471*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE void ClobberMemory() {
472*dbb99499SAndroid Build Coastguard Worker std::atomic_signal_fence(std::memory_order_acq_rel);
473*dbb99499SAndroid Build Coastguard Worker }
474*dbb99499SAndroid Build Coastguard Worker #endif
475*dbb99499SAndroid Build Coastguard Worker
476*dbb99499SAndroid Build Coastguard Worker // The DoNotOptimize(...) function can be used to prevent a value or
477*dbb99499SAndroid Build Coastguard Worker // expression from being optimized away by the compiler. This function is
478*dbb99499SAndroid Build Coastguard Worker // intended to add little to no overhead.
479*dbb99499SAndroid Build Coastguard Worker // See: https://youtu.be/nXaxk27zwlk?t=2441
480*dbb99499SAndroid Build Coastguard Worker #ifndef BENCHMARK_HAS_NO_INLINE_ASSEMBLY
481*dbb99499SAndroid Build Coastguard Worker #if !defined(__GNUC__) || defined(__llvm__) || defined(__INTEL_COMPILER)
482*dbb99499SAndroid Build Coastguard Worker template <class Tp>
483*dbb99499SAndroid Build Coastguard Worker BENCHMARK_DEPRECATED_MSG(
484*dbb99499SAndroid Build Coastguard Worker "The const-ref version of this method can permit "
485*dbb99499SAndroid Build Coastguard Worker "undesired compiler optimizations in benchmarks")
DoNotOptimize(Tp const & value)486*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp const& value) {
487*dbb99499SAndroid Build Coastguard Worker asm volatile("" : : "r,m"(value) : "memory");
488*dbb99499SAndroid Build Coastguard Worker }
489*dbb99499SAndroid Build Coastguard Worker
490*dbb99499SAndroid Build Coastguard Worker template <class Tp>
DoNotOptimize(Tp & value)491*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp& value) {
492*dbb99499SAndroid Build Coastguard Worker #if defined(__clang__)
493*dbb99499SAndroid Build Coastguard Worker asm volatile("" : "+r,m"(value) : : "memory");
494*dbb99499SAndroid Build Coastguard Worker #else
495*dbb99499SAndroid Build Coastguard Worker asm volatile("" : "+m,r"(value) : : "memory");
496*dbb99499SAndroid Build Coastguard Worker #endif
497*dbb99499SAndroid Build Coastguard Worker }
498*dbb99499SAndroid Build Coastguard Worker
499*dbb99499SAndroid Build Coastguard Worker #ifdef BENCHMARK_HAS_CXX11
500*dbb99499SAndroid Build Coastguard Worker template <class Tp>
DoNotOptimize(Tp && value)501*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp&& value) {
502*dbb99499SAndroid Build Coastguard Worker #if defined(__clang__)
503*dbb99499SAndroid Build Coastguard Worker asm volatile("" : "+r,m"(value) : : "memory");
504*dbb99499SAndroid Build Coastguard Worker #else
505*dbb99499SAndroid Build Coastguard Worker asm volatile("" : "+m,r"(value) : : "memory");
506*dbb99499SAndroid Build Coastguard Worker #endif
507*dbb99499SAndroid Build Coastguard Worker }
508*dbb99499SAndroid Build Coastguard Worker #endif
509*dbb99499SAndroid Build Coastguard Worker #elif defined(BENCHMARK_HAS_CXX11) && (__GNUC__ >= 5)
510*dbb99499SAndroid Build Coastguard Worker // Workaround for a bug with full argument copy overhead with GCC.
511*dbb99499SAndroid Build Coastguard Worker // See: #1340 and https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105519
512*dbb99499SAndroid Build Coastguard Worker template <class Tp>
513*dbb99499SAndroid Build Coastguard Worker BENCHMARK_DEPRECATED_MSG(
514*dbb99499SAndroid Build Coastguard Worker "The const-ref version of this method can permit "
515*dbb99499SAndroid Build Coastguard Worker "undesired compiler optimizations in benchmarks")
516*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE
517*dbb99499SAndroid Build Coastguard Worker typename std::enable_if<std::is_trivially_copyable<Tp>::value &&
518*dbb99499SAndroid Build Coastguard Worker (sizeof(Tp) <= sizeof(Tp*))>::type
DoNotOptimize(Tp const & value)519*dbb99499SAndroid Build Coastguard Worker DoNotOptimize(Tp const& value) {
520*dbb99499SAndroid Build Coastguard Worker asm volatile("" : : "r,m"(value) : "memory");
521*dbb99499SAndroid Build Coastguard Worker }
522*dbb99499SAndroid Build Coastguard Worker
523*dbb99499SAndroid Build Coastguard Worker template <class Tp>
524*dbb99499SAndroid Build Coastguard Worker BENCHMARK_DEPRECATED_MSG(
525*dbb99499SAndroid Build Coastguard Worker "The const-ref version of this method can permit "
526*dbb99499SAndroid Build Coastguard Worker "undesired compiler optimizations in benchmarks")
527*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE
528*dbb99499SAndroid Build Coastguard Worker typename std::enable_if<!std::is_trivially_copyable<Tp>::value ||
529*dbb99499SAndroid Build Coastguard Worker (sizeof(Tp) > sizeof(Tp*))>::type
DoNotOptimize(Tp const & value)530*dbb99499SAndroid Build Coastguard Worker DoNotOptimize(Tp const& value) {
531*dbb99499SAndroid Build Coastguard Worker asm volatile("" : : "m"(value) : "memory");
532*dbb99499SAndroid Build Coastguard Worker }
533*dbb99499SAndroid Build Coastguard Worker
534*dbb99499SAndroid Build Coastguard Worker template <class Tp>
535*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE
536*dbb99499SAndroid Build Coastguard Worker typename std::enable_if<std::is_trivially_copyable<Tp>::value &&
537*dbb99499SAndroid Build Coastguard Worker (sizeof(Tp) <= sizeof(Tp*))>::type
DoNotOptimize(Tp & value)538*dbb99499SAndroid Build Coastguard Worker DoNotOptimize(Tp& value) {
539*dbb99499SAndroid Build Coastguard Worker asm volatile("" : "+m,r"(value) : : "memory");
540*dbb99499SAndroid Build Coastguard Worker }
541*dbb99499SAndroid Build Coastguard Worker
542*dbb99499SAndroid Build Coastguard Worker template <class Tp>
543*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE
544*dbb99499SAndroid Build Coastguard Worker typename std::enable_if<!std::is_trivially_copyable<Tp>::value ||
545*dbb99499SAndroid Build Coastguard Worker (sizeof(Tp) > sizeof(Tp*))>::type
DoNotOptimize(Tp & value)546*dbb99499SAndroid Build Coastguard Worker DoNotOptimize(Tp& value) {
547*dbb99499SAndroid Build Coastguard Worker asm volatile("" : "+m"(value) : : "memory");
548*dbb99499SAndroid Build Coastguard Worker }
549*dbb99499SAndroid Build Coastguard Worker
550*dbb99499SAndroid Build Coastguard Worker template <class Tp>
551*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE
552*dbb99499SAndroid Build Coastguard Worker typename std::enable_if<std::is_trivially_copyable<Tp>::value &&
553*dbb99499SAndroid Build Coastguard Worker (sizeof(Tp) <= sizeof(Tp*))>::type
DoNotOptimize(Tp && value)554*dbb99499SAndroid Build Coastguard Worker DoNotOptimize(Tp&& value) {
555*dbb99499SAndroid Build Coastguard Worker asm volatile("" : "+m,r"(value) : : "memory");
556*dbb99499SAndroid Build Coastguard Worker }
557*dbb99499SAndroid Build Coastguard Worker
558*dbb99499SAndroid Build Coastguard Worker template <class Tp>
559*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE
560*dbb99499SAndroid Build Coastguard Worker typename std::enable_if<!std::is_trivially_copyable<Tp>::value ||
561*dbb99499SAndroid Build Coastguard Worker (sizeof(Tp) > sizeof(Tp*))>::type
DoNotOptimize(Tp && value)562*dbb99499SAndroid Build Coastguard Worker DoNotOptimize(Tp&& value) {
563*dbb99499SAndroid Build Coastguard Worker asm volatile("" : "+m"(value) : : "memory");
564*dbb99499SAndroid Build Coastguard Worker }
565*dbb99499SAndroid Build Coastguard Worker
566*dbb99499SAndroid Build Coastguard Worker #else
567*dbb99499SAndroid Build Coastguard Worker // Fallback for GCC < 5. Can add some overhead because the compiler is forced
568*dbb99499SAndroid Build Coastguard Worker // to use memory operations instead of operations with registers.
569*dbb99499SAndroid Build Coastguard Worker // TODO: Remove if GCC < 5 will be unsupported.
570*dbb99499SAndroid Build Coastguard Worker template <class Tp>
571*dbb99499SAndroid Build Coastguard Worker BENCHMARK_DEPRECATED_MSG(
572*dbb99499SAndroid Build Coastguard Worker "The const-ref version of this method can permit "
573*dbb99499SAndroid Build Coastguard Worker "undesired compiler optimizations in benchmarks")
DoNotOptimize(Tp const & value)574*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp const& value) {
575*dbb99499SAndroid Build Coastguard Worker asm volatile("" : : "m"(value) : "memory");
576*dbb99499SAndroid Build Coastguard Worker }
577*dbb99499SAndroid Build Coastguard Worker
578*dbb99499SAndroid Build Coastguard Worker template <class Tp>
DoNotOptimize(Tp & value)579*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp& value) {
580*dbb99499SAndroid Build Coastguard Worker asm volatile("" : "+m"(value) : : "memory");
581*dbb99499SAndroid Build Coastguard Worker }
582*dbb99499SAndroid Build Coastguard Worker
583*dbb99499SAndroid Build Coastguard Worker #ifdef BENCHMARK_HAS_CXX11
584*dbb99499SAndroid Build Coastguard Worker template <class Tp>
DoNotOptimize(Tp && value)585*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp&& value) {
586*dbb99499SAndroid Build Coastguard Worker asm volatile("" : "+m"(value) : : "memory");
587*dbb99499SAndroid Build Coastguard Worker }
588*dbb99499SAndroid Build Coastguard Worker #endif
589*dbb99499SAndroid Build Coastguard Worker #endif
590*dbb99499SAndroid Build Coastguard Worker
591*dbb99499SAndroid Build Coastguard Worker #ifndef BENCHMARK_HAS_CXX11
ClobberMemory()592*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE void ClobberMemory() {
593*dbb99499SAndroid Build Coastguard Worker asm volatile("" : : : "memory");
594*dbb99499SAndroid Build Coastguard Worker }
595*dbb99499SAndroid Build Coastguard Worker #endif
596*dbb99499SAndroid Build Coastguard Worker #elif defined(_MSC_VER)
597*dbb99499SAndroid Build Coastguard Worker template <class Tp>
598*dbb99499SAndroid Build Coastguard Worker BENCHMARK_DEPRECATED_MSG(
599*dbb99499SAndroid Build Coastguard Worker "The const-ref version of this method can permit "
600*dbb99499SAndroid Build Coastguard Worker "undesired compiler optimizations in benchmarks")
DoNotOptimize(Tp const & value)601*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp const& value) {
602*dbb99499SAndroid Build Coastguard Worker internal::UseCharPointer(&reinterpret_cast<char const volatile&>(value));
603*dbb99499SAndroid Build Coastguard Worker _ReadWriteBarrier();
604*dbb99499SAndroid Build Coastguard Worker }
605*dbb99499SAndroid Build Coastguard Worker
606*dbb99499SAndroid Build Coastguard Worker #ifndef BENCHMARK_HAS_CXX11
ClobberMemory()607*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE void ClobberMemory() { _ReadWriteBarrier(); }
608*dbb99499SAndroid Build Coastguard Worker #endif
609*dbb99499SAndroid Build Coastguard Worker #else
610*dbb99499SAndroid Build Coastguard Worker #ifdef BENCHMARK_HAS_CXX11
611*dbb99499SAndroid Build Coastguard Worker template <class Tp>
DoNotOptimize(Tp && value)612*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp&& value) {
613*dbb99499SAndroid Build Coastguard Worker internal::UseCharPointer(&reinterpret_cast<char const volatile&>(value));
614*dbb99499SAndroid Build Coastguard Worker }
615*dbb99499SAndroid Build Coastguard Worker #else
616*dbb99499SAndroid Build Coastguard Worker template <class Tp>
617*dbb99499SAndroid Build Coastguard Worker BENCHMARK_DEPRECATED_MSG(
618*dbb99499SAndroid Build Coastguard Worker "The const-ref version of this method can permit "
619*dbb99499SAndroid Build Coastguard Worker "undesired compiler optimizations in benchmarks")
DoNotOptimize(Tp const & value)620*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp const& value) {
621*dbb99499SAndroid Build Coastguard Worker internal::UseCharPointer(&reinterpret_cast<char const volatile&>(value));
622*dbb99499SAndroid Build Coastguard Worker }
623*dbb99499SAndroid Build Coastguard Worker
624*dbb99499SAndroid Build Coastguard Worker template <class Tp>
DoNotOptimize(Tp & value)625*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp& value) {
626*dbb99499SAndroid Build Coastguard Worker internal::UseCharPointer(&reinterpret_cast<char const volatile&>(value));
627*dbb99499SAndroid Build Coastguard Worker }
628*dbb99499SAndroid Build Coastguard Worker #endif
629*dbb99499SAndroid Build Coastguard Worker // FIXME Add ClobberMemory() for non-gnu and non-msvc compilers, before C++11.
630*dbb99499SAndroid Build Coastguard Worker #endif
631*dbb99499SAndroid Build Coastguard Worker
632*dbb99499SAndroid Build Coastguard Worker // This class is used for user-defined counters.
633*dbb99499SAndroid Build Coastguard Worker class Counter {
634*dbb99499SAndroid Build Coastguard Worker public:
635*dbb99499SAndroid Build Coastguard Worker enum Flags {
636*dbb99499SAndroid Build Coastguard Worker kDefaults = 0,
637*dbb99499SAndroid Build Coastguard Worker // Mark the counter as a rate. It will be presented divided
638*dbb99499SAndroid Build Coastguard Worker // by the duration of the benchmark.
639*dbb99499SAndroid Build Coastguard Worker kIsRate = 1 << 0,
640*dbb99499SAndroid Build Coastguard Worker // Mark the counter as a thread-average quantity. It will be
641*dbb99499SAndroid Build Coastguard Worker // presented divided by the number of threads.
642*dbb99499SAndroid Build Coastguard Worker kAvgThreads = 1 << 1,
643*dbb99499SAndroid Build Coastguard Worker // Mark the counter as a thread-average rate. See above.
644*dbb99499SAndroid Build Coastguard Worker kAvgThreadsRate = kIsRate | kAvgThreads,
645*dbb99499SAndroid Build Coastguard Worker // Mark the counter as a constant value, valid/same for *every* iteration.
646*dbb99499SAndroid Build Coastguard Worker // When reporting, it will be *multiplied* by the iteration count.
647*dbb99499SAndroid Build Coastguard Worker kIsIterationInvariant = 1 << 2,
648*dbb99499SAndroid Build Coastguard Worker // Mark the counter as a constant rate.
649*dbb99499SAndroid Build Coastguard Worker // When reporting, it will be *multiplied* by the iteration count
650*dbb99499SAndroid Build Coastguard Worker // and then divided by the duration of the benchmark.
651*dbb99499SAndroid Build Coastguard Worker kIsIterationInvariantRate = kIsRate | kIsIterationInvariant,
652*dbb99499SAndroid Build Coastguard Worker // Mark the counter as a iteration-average quantity.
653*dbb99499SAndroid Build Coastguard Worker // It will be presented divided by the number of iterations.
654*dbb99499SAndroid Build Coastguard Worker kAvgIterations = 1 << 3,
655*dbb99499SAndroid Build Coastguard Worker // Mark the counter as a iteration-average rate. See above.
656*dbb99499SAndroid Build Coastguard Worker kAvgIterationsRate = kIsRate | kAvgIterations,
657*dbb99499SAndroid Build Coastguard Worker
658*dbb99499SAndroid Build Coastguard Worker // In the end, invert the result. This is always done last!
659*dbb99499SAndroid Build Coastguard Worker kInvert = 1 << 31
660*dbb99499SAndroid Build Coastguard Worker };
661*dbb99499SAndroid Build Coastguard Worker
662*dbb99499SAndroid Build Coastguard Worker enum OneK {
663*dbb99499SAndroid Build Coastguard Worker // 1'000 items per 1k
664*dbb99499SAndroid Build Coastguard Worker kIs1000 = 1000,
665*dbb99499SAndroid Build Coastguard Worker // 1'024 items per 1k
666*dbb99499SAndroid Build Coastguard Worker kIs1024 = 1024
667*dbb99499SAndroid Build Coastguard Worker };
668*dbb99499SAndroid Build Coastguard Worker
669*dbb99499SAndroid Build Coastguard Worker double value;
670*dbb99499SAndroid Build Coastguard Worker Flags flags;
671*dbb99499SAndroid Build Coastguard Worker OneK oneK;
672*dbb99499SAndroid Build Coastguard Worker
673*dbb99499SAndroid Build Coastguard Worker BENCHMARK_ALWAYS_INLINE
674*dbb99499SAndroid Build Coastguard Worker Counter(double v = 0., Flags f = kDefaults, OneK k = kIs1000)
value(v)675*dbb99499SAndroid Build Coastguard Worker : value(v), flags(f), oneK(k) {}
676*dbb99499SAndroid Build Coastguard Worker
677*dbb99499SAndroid Build Coastguard Worker BENCHMARK_ALWAYS_INLINE operator double const &() const { return value; }
678*dbb99499SAndroid Build Coastguard Worker BENCHMARK_ALWAYS_INLINE operator double&() { return value; }
679*dbb99499SAndroid Build Coastguard Worker };
680*dbb99499SAndroid Build Coastguard Worker
681*dbb99499SAndroid Build Coastguard Worker // A helper for user code to create unforeseen combinations of Flags, without
682*dbb99499SAndroid Build Coastguard Worker // having to do this cast manually each time, or providing this operator.
683*dbb99499SAndroid Build Coastguard Worker Counter::Flags inline operator|(const Counter::Flags& LHS,
684*dbb99499SAndroid Build Coastguard Worker const Counter::Flags& RHS) {
685*dbb99499SAndroid Build Coastguard Worker return static_cast<Counter::Flags>(static_cast<int>(LHS) |
686*dbb99499SAndroid Build Coastguard Worker static_cast<int>(RHS));
687*dbb99499SAndroid Build Coastguard Worker }
688*dbb99499SAndroid Build Coastguard Worker
689*dbb99499SAndroid Build Coastguard Worker // This is the container for the user-defined counters.
690*dbb99499SAndroid Build Coastguard Worker typedef std::map<std::string, Counter> UserCounters;
691*dbb99499SAndroid Build Coastguard Worker
692*dbb99499SAndroid Build Coastguard Worker // BigO is passed to a benchmark in order to specify the asymptotic
693*dbb99499SAndroid Build Coastguard Worker // computational
694*dbb99499SAndroid Build Coastguard Worker // complexity for the benchmark. In case oAuto is selected, complexity will be
695*dbb99499SAndroid Build Coastguard Worker // calculated automatically to the best fit.
696*dbb99499SAndroid Build Coastguard Worker enum BigO { oNone, o1, oN, oNSquared, oNCubed, oLogN, oNLogN, oAuto, oLambda };
697*dbb99499SAndroid Build Coastguard Worker
698*dbb99499SAndroid Build Coastguard Worker typedef int64_t ComplexityN;
699*dbb99499SAndroid Build Coastguard Worker
700*dbb99499SAndroid Build Coastguard Worker typedef int64_t IterationCount;
701*dbb99499SAndroid Build Coastguard Worker
702*dbb99499SAndroid Build Coastguard Worker enum StatisticUnit { kTime, kPercentage };
703*dbb99499SAndroid Build Coastguard Worker
704*dbb99499SAndroid Build Coastguard Worker // BigOFunc is passed to a benchmark in order to specify the asymptotic
705*dbb99499SAndroid Build Coastguard Worker // computational complexity for the benchmark.
706*dbb99499SAndroid Build Coastguard Worker typedef double(BigOFunc)(ComplexityN);
707*dbb99499SAndroid Build Coastguard Worker
708*dbb99499SAndroid Build Coastguard Worker // StatisticsFunc is passed to a benchmark in order to compute some descriptive
709*dbb99499SAndroid Build Coastguard Worker // statistics over all the measurements of some type
710*dbb99499SAndroid Build Coastguard Worker typedef double(StatisticsFunc)(const std::vector<double>&);
711*dbb99499SAndroid Build Coastguard Worker
712*dbb99499SAndroid Build Coastguard Worker namespace internal {
713*dbb99499SAndroid Build Coastguard Worker struct Statistics {
714*dbb99499SAndroid Build Coastguard Worker std::string name_;
715*dbb99499SAndroid Build Coastguard Worker StatisticsFunc* compute_;
716*dbb99499SAndroid Build Coastguard Worker StatisticUnit unit_;
717*dbb99499SAndroid Build Coastguard Worker
718*dbb99499SAndroid Build Coastguard Worker Statistics(const std::string& name, StatisticsFunc* compute,
719*dbb99499SAndroid Build Coastguard Worker StatisticUnit unit = kTime)
name_Statistics720*dbb99499SAndroid Build Coastguard Worker : name_(name), compute_(compute), unit_(unit) {}
721*dbb99499SAndroid Build Coastguard Worker };
722*dbb99499SAndroid Build Coastguard Worker
723*dbb99499SAndroid Build Coastguard Worker class BenchmarkInstance;
724*dbb99499SAndroid Build Coastguard Worker class ThreadTimer;
725*dbb99499SAndroid Build Coastguard Worker class ThreadManager;
726*dbb99499SAndroid Build Coastguard Worker class PerfCountersMeasurement;
727*dbb99499SAndroid Build Coastguard Worker
728*dbb99499SAndroid Build Coastguard Worker enum AggregationReportMode
729*dbb99499SAndroid Build Coastguard Worker #if defined(BENCHMARK_HAS_CXX11)
730*dbb99499SAndroid Build Coastguard Worker : unsigned
731*dbb99499SAndroid Build Coastguard Worker #else
732*dbb99499SAndroid Build Coastguard Worker #endif
733*dbb99499SAndroid Build Coastguard Worker {
734*dbb99499SAndroid Build Coastguard Worker // The mode has not been manually specified
735*dbb99499SAndroid Build Coastguard Worker ARM_Unspecified = 0,
736*dbb99499SAndroid Build Coastguard Worker // The mode is user-specified.
737*dbb99499SAndroid Build Coastguard Worker // This may or may not be set when the following bit-flags are set.
738*dbb99499SAndroid Build Coastguard Worker ARM_Default = 1U << 0U,
739*dbb99499SAndroid Build Coastguard Worker // File reporter should only output aggregates.
740*dbb99499SAndroid Build Coastguard Worker ARM_FileReportAggregatesOnly = 1U << 1U,
741*dbb99499SAndroid Build Coastguard Worker // Display reporter should only output aggregates
742*dbb99499SAndroid Build Coastguard Worker ARM_DisplayReportAggregatesOnly = 1U << 2U,
743*dbb99499SAndroid Build Coastguard Worker // Both reporters should only display aggregates.
744*dbb99499SAndroid Build Coastguard Worker ARM_ReportAggregatesOnly =
745*dbb99499SAndroid Build Coastguard Worker ARM_FileReportAggregatesOnly | ARM_DisplayReportAggregatesOnly
746*dbb99499SAndroid Build Coastguard Worker };
747*dbb99499SAndroid Build Coastguard Worker
748*dbb99499SAndroid Build Coastguard Worker enum Skipped
749*dbb99499SAndroid Build Coastguard Worker #if defined(BENCHMARK_HAS_CXX11)
750*dbb99499SAndroid Build Coastguard Worker : unsigned
751*dbb99499SAndroid Build Coastguard Worker #endif
752*dbb99499SAndroid Build Coastguard Worker {
753*dbb99499SAndroid Build Coastguard Worker NotSkipped = 0,
754*dbb99499SAndroid Build Coastguard Worker SkippedWithMessage,
755*dbb99499SAndroid Build Coastguard Worker SkippedWithError
756*dbb99499SAndroid Build Coastguard Worker };
757*dbb99499SAndroid Build Coastguard Worker
758*dbb99499SAndroid Build Coastguard Worker } // namespace internal
759*dbb99499SAndroid Build Coastguard Worker
760*dbb99499SAndroid Build Coastguard Worker // State is passed to a running Benchmark and contains state for the
761*dbb99499SAndroid Build Coastguard Worker // benchmark to use.
762*dbb99499SAndroid Build Coastguard Worker class BENCHMARK_EXPORT State {
763*dbb99499SAndroid Build Coastguard Worker public:
764*dbb99499SAndroid Build Coastguard Worker struct StateIterator;
765*dbb99499SAndroid Build Coastguard Worker friend struct StateIterator;
766*dbb99499SAndroid Build Coastguard Worker
767*dbb99499SAndroid Build Coastguard Worker // Returns iterators used to run each iteration of a benchmark using a
768*dbb99499SAndroid Build Coastguard Worker // C++11 ranged-based for loop. These functions should not be called directly.
769*dbb99499SAndroid Build Coastguard Worker //
770*dbb99499SAndroid Build Coastguard Worker // REQUIRES: The benchmark has not started running yet. Neither begin nor end
771*dbb99499SAndroid Build Coastguard Worker // have been called previously.
772*dbb99499SAndroid Build Coastguard Worker //
773*dbb99499SAndroid Build Coastguard Worker // NOTE: KeepRunning may not be used after calling either of these functions.
774*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE StateIterator begin();
775*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE StateIterator end();
776*dbb99499SAndroid Build Coastguard Worker
777*dbb99499SAndroid Build Coastguard Worker // Returns true if the benchmark should continue through another iteration.
778*dbb99499SAndroid Build Coastguard Worker // NOTE: A benchmark may not return from the test until KeepRunning() has
779*dbb99499SAndroid Build Coastguard Worker // returned false.
780*dbb99499SAndroid Build Coastguard Worker inline bool KeepRunning();
781*dbb99499SAndroid Build Coastguard Worker
782*dbb99499SAndroid Build Coastguard Worker // Returns true iff the benchmark should run n more iterations.
783*dbb99499SAndroid Build Coastguard Worker // REQUIRES: 'n' > 0.
784*dbb99499SAndroid Build Coastguard Worker // NOTE: A benchmark must not return from the test until KeepRunningBatch()
785*dbb99499SAndroid Build Coastguard Worker // has returned false.
786*dbb99499SAndroid Build Coastguard Worker // NOTE: KeepRunningBatch() may overshoot by up to 'n' iterations.
787*dbb99499SAndroid Build Coastguard Worker //
788*dbb99499SAndroid Build Coastguard Worker // Intended usage:
789*dbb99499SAndroid Build Coastguard Worker // while (state.KeepRunningBatch(1000)) {
790*dbb99499SAndroid Build Coastguard Worker // // process 1000 elements
791*dbb99499SAndroid Build Coastguard Worker // }
792*dbb99499SAndroid Build Coastguard Worker inline bool KeepRunningBatch(IterationCount n);
793*dbb99499SAndroid Build Coastguard Worker
794*dbb99499SAndroid Build Coastguard Worker // REQUIRES: timer is running and 'SkipWithMessage(...)' or
795*dbb99499SAndroid Build Coastguard Worker // 'SkipWithError(...)' has not been called by the current thread.
796*dbb99499SAndroid Build Coastguard Worker // Stop the benchmark timer. If not called, the timer will be
797*dbb99499SAndroid Build Coastguard Worker // automatically stopped after the last iteration of the benchmark loop.
798*dbb99499SAndroid Build Coastguard Worker //
799*dbb99499SAndroid Build Coastguard Worker // For threaded benchmarks the PauseTiming() function only pauses the timing
800*dbb99499SAndroid Build Coastguard Worker // for the current thread.
801*dbb99499SAndroid Build Coastguard Worker //
802*dbb99499SAndroid Build Coastguard Worker // NOTE: The "real time" measurement is per-thread. If different threads
803*dbb99499SAndroid Build Coastguard Worker // report different measurements the largest one is reported.
804*dbb99499SAndroid Build Coastguard Worker //
805*dbb99499SAndroid Build Coastguard Worker // NOTE: PauseTiming()/ResumeTiming() are relatively
806*dbb99499SAndroid Build Coastguard Worker // heavyweight, and so their use should generally be avoided
807*dbb99499SAndroid Build Coastguard Worker // within each benchmark iteration, if possible.
808*dbb99499SAndroid Build Coastguard Worker void PauseTiming();
809*dbb99499SAndroid Build Coastguard Worker
810*dbb99499SAndroid Build Coastguard Worker // REQUIRES: timer is not running and 'SkipWithMessage(...)' or
811*dbb99499SAndroid Build Coastguard Worker // 'SkipWithError(...)' has not been called by the current thread.
812*dbb99499SAndroid Build Coastguard Worker // Start the benchmark timer. The timer is NOT running on entrance to the
813*dbb99499SAndroid Build Coastguard Worker // benchmark function. It begins running after control flow enters the
814*dbb99499SAndroid Build Coastguard Worker // benchmark loop.
815*dbb99499SAndroid Build Coastguard Worker //
816*dbb99499SAndroid Build Coastguard Worker // NOTE: PauseTiming()/ResumeTiming() are relatively
817*dbb99499SAndroid Build Coastguard Worker // heavyweight, and so their use should generally be avoided
818*dbb99499SAndroid Build Coastguard Worker // within each benchmark iteration, if possible.
819*dbb99499SAndroid Build Coastguard Worker void ResumeTiming();
820*dbb99499SAndroid Build Coastguard Worker
821*dbb99499SAndroid Build Coastguard Worker // REQUIRES: 'SkipWithMessage(...)' or 'SkipWithError(...)' has not been
822*dbb99499SAndroid Build Coastguard Worker // called previously by the current thread.
823*dbb99499SAndroid Build Coastguard Worker // Report the benchmark as resulting in being skipped with the specified
824*dbb99499SAndroid Build Coastguard Worker // 'msg'.
825*dbb99499SAndroid Build Coastguard Worker // After this call the user may explicitly 'return' from the benchmark.
826*dbb99499SAndroid Build Coastguard Worker //
827*dbb99499SAndroid Build Coastguard Worker // If the ranged-for style of benchmark loop is used, the user must explicitly
828*dbb99499SAndroid Build Coastguard Worker // break from the loop, otherwise all future iterations will be run.
829*dbb99499SAndroid Build Coastguard Worker // If the 'KeepRunning()' loop is used the current thread will automatically
830*dbb99499SAndroid Build Coastguard Worker // exit the loop at the end of the current iteration.
831*dbb99499SAndroid Build Coastguard Worker //
832*dbb99499SAndroid Build Coastguard Worker // For threaded benchmarks only the current thread stops executing and future
833*dbb99499SAndroid Build Coastguard Worker // calls to `KeepRunning()` will block until all threads have completed
834*dbb99499SAndroid Build Coastguard Worker // the `KeepRunning()` loop. If multiple threads report being skipped only the
835*dbb99499SAndroid Build Coastguard Worker // first skip message is used.
836*dbb99499SAndroid Build Coastguard Worker //
837*dbb99499SAndroid Build Coastguard Worker // NOTE: Calling 'SkipWithMessage(...)' does not cause the benchmark to exit
838*dbb99499SAndroid Build Coastguard Worker // the current scope immediately. If the function is called from within
839*dbb99499SAndroid Build Coastguard Worker // the 'KeepRunning()' loop the current iteration will finish. It is the users
840*dbb99499SAndroid Build Coastguard Worker // responsibility to exit the scope as needed.
841*dbb99499SAndroid Build Coastguard Worker void SkipWithMessage(const std::string& msg);
842*dbb99499SAndroid Build Coastguard Worker
843*dbb99499SAndroid Build Coastguard Worker // REQUIRES: 'SkipWithMessage(...)' or 'SkipWithError(...)' has not been
844*dbb99499SAndroid Build Coastguard Worker // called previously by the current thread.
845*dbb99499SAndroid Build Coastguard Worker // Report the benchmark as resulting in an error with the specified 'msg'.
846*dbb99499SAndroid Build Coastguard Worker // After this call the user may explicitly 'return' from the benchmark.
847*dbb99499SAndroid Build Coastguard Worker //
848*dbb99499SAndroid Build Coastguard Worker // If the ranged-for style of benchmark loop is used, the user must explicitly
849*dbb99499SAndroid Build Coastguard Worker // break from the loop, otherwise all future iterations will be run.
850*dbb99499SAndroid Build Coastguard Worker // If the 'KeepRunning()' loop is used the current thread will automatically
851*dbb99499SAndroid Build Coastguard Worker // exit the loop at the end of the current iteration.
852*dbb99499SAndroid Build Coastguard Worker //
853*dbb99499SAndroid Build Coastguard Worker // For threaded benchmarks only the current thread stops executing and future
854*dbb99499SAndroid Build Coastguard Worker // calls to `KeepRunning()` will block until all threads have completed
855*dbb99499SAndroid Build Coastguard Worker // the `KeepRunning()` loop. If multiple threads report an error only the
856*dbb99499SAndroid Build Coastguard Worker // first error message is used.
857*dbb99499SAndroid Build Coastguard Worker //
858*dbb99499SAndroid Build Coastguard Worker // NOTE: Calling 'SkipWithError(...)' does not cause the benchmark to exit
859*dbb99499SAndroid Build Coastguard Worker // the current scope immediately. If the function is called from within
860*dbb99499SAndroid Build Coastguard Worker // the 'KeepRunning()' loop the current iteration will finish. It is the users
861*dbb99499SAndroid Build Coastguard Worker // responsibility to exit the scope as needed.
862*dbb99499SAndroid Build Coastguard Worker void SkipWithError(const std::string& msg);
863*dbb99499SAndroid Build Coastguard Worker
864*dbb99499SAndroid Build Coastguard Worker // Returns true if 'SkipWithMessage(...)' or 'SkipWithError(...)' was called.
skipped()865*dbb99499SAndroid Build Coastguard Worker bool skipped() const { return internal::NotSkipped != skipped_; }
866*dbb99499SAndroid Build Coastguard Worker
867*dbb99499SAndroid Build Coastguard Worker // Returns true if an error has been reported with 'SkipWithError(...)'.
error_occurred()868*dbb99499SAndroid Build Coastguard Worker bool error_occurred() const { return internal::SkippedWithError == skipped_; }
869*dbb99499SAndroid Build Coastguard Worker
870*dbb99499SAndroid Build Coastguard Worker // REQUIRES: called exactly once per iteration of the benchmarking loop.
871*dbb99499SAndroid Build Coastguard Worker // Set the manually measured time for this benchmark iteration, which
872*dbb99499SAndroid Build Coastguard Worker // is used instead of automatically measured time if UseManualTime() was
873*dbb99499SAndroid Build Coastguard Worker // specified.
874*dbb99499SAndroid Build Coastguard Worker //
875*dbb99499SAndroid Build Coastguard Worker // For threaded benchmarks the final value will be set to the largest
876*dbb99499SAndroid Build Coastguard Worker // reported values.
877*dbb99499SAndroid Build Coastguard Worker void SetIterationTime(double seconds);
878*dbb99499SAndroid Build Coastguard Worker
879*dbb99499SAndroid Build Coastguard Worker // Set the number of bytes processed by the current benchmark
880*dbb99499SAndroid Build Coastguard Worker // execution. This routine is typically called once at the end of a
881*dbb99499SAndroid Build Coastguard Worker // throughput oriented benchmark.
882*dbb99499SAndroid Build Coastguard Worker //
883*dbb99499SAndroid Build Coastguard Worker // REQUIRES: a benchmark has exited its benchmarking loop.
884*dbb99499SAndroid Build Coastguard Worker BENCHMARK_ALWAYS_INLINE
SetBytesProcessed(int64_t bytes)885*dbb99499SAndroid Build Coastguard Worker void SetBytesProcessed(int64_t bytes) {
886*dbb99499SAndroid Build Coastguard Worker counters["bytes_per_second"] =
887*dbb99499SAndroid Build Coastguard Worker Counter(static_cast<double>(bytes), Counter::kIsRate, Counter::kIs1024);
888*dbb99499SAndroid Build Coastguard Worker }
889*dbb99499SAndroid Build Coastguard Worker
890*dbb99499SAndroid Build Coastguard Worker BENCHMARK_ALWAYS_INLINE
bytes_processed()891*dbb99499SAndroid Build Coastguard Worker int64_t bytes_processed() const {
892*dbb99499SAndroid Build Coastguard Worker if (counters.find("bytes_per_second") != counters.end())
893*dbb99499SAndroid Build Coastguard Worker return static_cast<int64_t>(counters.at("bytes_per_second"));
894*dbb99499SAndroid Build Coastguard Worker return 0;
895*dbb99499SAndroid Build Coastguard Worker }
896*dbb99499SAndroid Build Coastguard Worker
897*dbb99499SAndroid Build Coastguard Worker // If this routine is called with complexity_n > 0 and complexity report is
898*dbb99499SAndroid Build Coastguard Worker // requested for the
899*dbb99499SAndroid Build Coastguard Worker // family benchmark, then current benchmark will be part of the computation
900*dbb99499SAndroid Build Coastguard Worker // and complexity_n will
901*dbb99499SAndroid Build Coastguard Worker // represent the length of N.
902*dbb99499SAndroid Build Coastguard Worker BENCHMARK_ALWAYS_INLINE
SetComplexityN(ComplexityN complexity_n)903*dbb99499SAndroid Build Coastguard Worker void SetComplexityN(ComplexityN complexity_n) {
904*dbb99499SAndroid Build Coastguard Worker complexity_n_ = complexity_n;
905*dbb99499SAndroid Build Coastguard Worker }
906*dbb99499SAndroid Build Coastguard Worker
907*dbb99499SAndroid Build Coastguard Worker BENCHMARK_ALWAYS_INLINE
complexity_length_n()908*dbb99499SAndroid Build Coastguard Worker ComplexityN complexity_length_n() const { return complexity_n_; }
909*dbb99499SAndroid Build Coastguard Worker
910*dbb99499SAndroid Build Coastguard Worker // If this routine is called with items > 0, then an items/s
911*dbb99499SAndroid Build Coastguard Worker // label is printed on the benchmark report line for the currently
912*dbb99499SAndroid Build Coastguard Worker // executing benchmark. It is typically called at the end of a processing
913*dbb99499SAndroid Build Coastguard Worker // benchmark where a processing items/second output is desired.
914*dbb99499SAndroid Build Coastguard Worker //
915*dbb99499SAndroid Build Coastguard Worker // REQUIRES: a benchmark has exited its benchmarking loop.
916*dbb99499SAndroid Build Coastguard Worker BENCHMARK_ALWAYS_INLINE
SetItemsProcessed(int64_t items)917*dbb99499SAndroid Build Coastguard Worker void SetItemsProcessed(int64_t items) {
918*dbb99499SAndroid Build Coastguard Worker counters["items_per_second"] =
919*dbb99499SAndroid Build Coastguard Worker Counter(static_cast<double>(items), benchmark::Counter::kIsRate);
920*dbb99499SAndroid Build Coastguard Worker }
921*dbb99499SAndroid Build Coastguard Worker
922*dbb99499SAndroid Build Coastguard Worker BENCHMARK_ALWAYS_INLINE
items_processed()923*dbb99499SAndroid Build Coastguard Worker int64_t items_processed() const {
924*dbb99499SAndroid Build Coastguard Worker if (counters.find("items_per_second") != counters.end())
925*dbb99499SAndroid Build Coastguard Worker return static_cast<int64_t>(counters.at("items_per_second"));
926*dbb99499SAndroid Build Coastguard Worker return 0;
927*dbb99499SAndroid Build Coastguard Worker }
928*dbb99499SAndroid Build Coastguard Worker
929*dbb99499SAndroid Build Coastguard Worker // If this routine is called, the specified label is printed at the
930*dbb99499SAndroid Build Coastguard Worker // end of the benchmark report line for the currently executing
931*dbb99499SAndroid Build Coastguard Worker // benchmark. Example:
932*dbb99499SAndroid Build Coastguard Worker // static void BM_Compress(benchmark::State& state) {
933*dbb99499SAndroid Build Coastguard Worker // ...
934*dbb99499SAndroid Build Coastguard Worker // double compress = input_size / output_size;
935*dbb99499SAndroid Build Coastguard Worker // state.SetLabel(StrFormat("compress:%.1f%%", 100.0*compression));
936*dbb99499SAndroid Build Coastguard Worker // }
937*dbb99499SAndroid Build Coastguard Worker // Produces output that looks like:
938*dbb99499SAndroid Build Coastguard Worker // BM_Compress 50 50 14115038 compress:27.3%
939*dbb99499SAndroid Build Coastguard Worker //
940*dbb99499SAndroid Build Coastguard Worker // REQUIRES: a benchmark has exited its benchmarking loop.
941*dbb99499SAndroid Build Coastguard Worker void SetLabel(const std::string& label);
942*dbb99499SAndroid Build Coastguard Worker
943*dbb99499SAndroid Build Coastguard Worker // Range arguments for this run. CHECKs if the argument has been set.
944*dbb99499SAndroid Build Coastguard Worker BENCHMARK_ALWAYS_INLINE
945*dbb99499SAndroid Build Coastguard Worker int64_t range(std::size_t pos = 0) const {
946*dbb99499SAndroid Build Coastguard Worker assert(range_.size() > pos);
947*dbb99499SAndroid Build Coastguard Worker return range_[pos];
948*dbb99499SAndroid Build Coastguard Worker }
949*dbb99499SAndroid Build Coastguard Worker
950*dbb99499SAndroid Build Coastguard Worker BENCHMARK_DEPRECATED_MSG("use 'range(0)' instead")
range_x()951*dbb99499SAndroid Build Coastguard Worker int64_t range_x() const { return range(0); }
952*dbb99499SAndroid Build Coastguard Worker
953*dbb99499SAndroid Build Coastguard Worker BENCHMARK_DEPRECATED_MSG("use 'range(1)' instead")
range_y()954*dbb99499SAndroid Build Coastguard Worker int64_t range_y() const { return range(1); }
955*dbb99499SAndroid Build Coastguard Worker
956*dbb99499SAndroid Build Coastguard Worker // Number of threads concurrently executing the benchmark.
957*dbb99499SAndroid Build Coastguard Worker BENCHMARK_ALWAYS_INLINE
threads()958*dbb99499SAndroid Build Coastguard Worker int threads() const { return threads_; }
959*dbb99499SAndroid Build Coastguard Worker
960*dbb99499SAndroid Build Coastguard Worker // Index of the executing thread. Values from [0, threads).
961*dbb99499SAndroid Build Coastguard Worker BENCHMARK_ALWAYS_INLINE
thread_index()962*dbb99499SAndroid Build Coastguard Worker int thread_index() const { return thread_index_; }
963*dbb99499SAndroid Build Coastguard Worker
964*dbb99499SAndroid Build Coastguard Worker BENCHMARK_ALWAYS_INLINE
iterations()965*dbb99499SAndroid Build Coastguard Worker IterationCount iterations() const {
966*dbb99499SAndroid Build Coastguard Worker if (BENCHMARK_BUILTIN_EXPECT(!started_, false)) {
967*dbb99499SAndroid Build Coastguard Worker return 0;
968*dbb99499SAndroid Build Coastguard Worker }
969*dbb99499SAndroid Build Coastguard Worker return max_iterations - total_iterations_ + batch_leftover_;
970*dbb99499SAndroid Build Coastguard Worker }
971*dbb99499SAndroid Build Coastguard Worker
972*dbb99499SAndroid Build Coastguard Worker BENCHMARK_ALWAYS_INLINE
name()973*dbb99499SAndroid Build Coastguard Worker std::string name() const { return name_; }
974*dbb99499SAndroid Build Coastguard Worker
975*dbb99499SAndroid Build Coastguard Worker private:
976*dbb99499SAndroid Build Coastguard Worker // items we expect on the first cache line (ie 64 bytes of the struct)
977*dbb99499SAndroid Build Coastguard Worker // When total_iterations_ is 0, KeepRunning() and friends will return false.
978*dbb99499SAndroid Build Coastguard Worker // May be larger than max_iterations.
979*dbb99499SAndroid Build Coastguard Worker IterationCount total_iterations_;
980*dbb99499SAndroid Build Coastguard Worker
981*dbb99499SAndroid Build Coastguard Worker // When using KeepRunningBatch(), batch_leftover_ holds the number of
982*dbb99499SAndroid Build Coastguard Worker // iterations beyond max_iters that were run. Used to track
983*dbb99499SAndroid Build Coastguard Worker // completed_iterations_ accurately.
984*dbb99499SAndroid Build Coastguard Worker IterationCount batch_leftover_;
985*dbb99499SAndroid Build Coastguard Worker
986*dbb99499SAndroid Build Coastguard Worker public:
987*dbb99499SAndroid Build Coastguard Worker const IterationCount max_iterations;
988*dbb99499SAndroid Build Coastguard Worker
989*dbb99499SAndroid Build Coastguard Worker private:
990*dbb99499SAndroid Build Coastguard Worker bool started_;
991*dbb99499SAndroid Build Coastguard Worker bool finished_;
992*dbb99499SAndroid Build Coastguard Worker internal::Skipped skipped_;
993*dbb99499SAndroid Build Coastguard Worker
994*dbb99499SAndroid Build Coastguard Worker // items we don't need on the first cache line
995*dbb99499SAndroid Build Coastguard Worker std::vector<int64_t> range_;
996*dbb99499SAndroid Build Coastguard Worker
997*dbb99499SAndroid Build Coastguard Worker ComplexityN complexity_n_;
998*dbb99499SAndroid Build Coastguard Worker
999*dbb99499SAndroid Build Coastguard Worker public:
1000*dbb99499SAndroid Build Coastguard Worker // Container for user-defined counters.
1001*dbb99499SAndroid Build Coastguard Worker UserCounters counters;
1002*dbb99499SAndroid Build Coastguard Worker
1003*dbb99499SAndroid Build Coastguard Worker private:
1004*dbb99499SAndroid Build Coastguard Worker State(std::string name, IterationCount max_iters,
1005*dbb99499SAndroid Build Coastguard Worker const std::vector<int64_t>& ranges, int thread_i, int n_threads,
1006*dbb99499SAndroid Build Coastguard Worker internal::ThreadTimer* timer, internal::ThreadManager* manager,
1007*dbb99499SAndroid Build Coastguard Worker internal::PerfCountersMeasurement* perf_counters_measurement,
1008*dbb99499SAndroid Build Coastguard Worker ProfilerManager* profiler_manager);
1009*dbb99499SAndroid Build Coastguard Worker
1010*dbb99499SAndroid Build Coastguard Worker void StartKeepRunning();
1011*dbb99499SAndroid Build Coastguard Worker // Implementation of KeepRunning() and KeepRunningBatch().
1012*dbb99499SAndroid Build Coastguard Worker // is_batch must be true unless n is 1.
1013*dbb99499SAndroid Build Coastguard Worker inline bool KeepRunningInternal(IterationCount n, bool is_batch);
1014*dbb99499SAndroid Build Coastguard Worker void FinishKeepRunning();
1015*dbb99499SAndroid Build Coastguard Worker
1016*dbb99499SAndroid Build Coastguard Worker const std::string name_;
1017*dbb99499SAndroid Build Coastguard Worker const int thread_index_;
1018*dbb99499SAndroid Build Coastguard Worker const int threads_;
1019*dbb99499SAndroid Build Coastguard Worker
1020*dbb99499SAndroid Build Coastguard Worker internal::ThreadTimer* const timer_;
1021*dbb99499SAndroid Build Coastguard Worker internal::ThreadManager* const manager_;
1022*dbb99499SAndroid Build Coastguard Worker internal::PerfCountersMeasurement* const perf_counters_measurement_;
1023*dbb99499SAndroid Build Coastguard Worker ProfilerManager* const profiler_manager_;
1024*dbb99499SAndroid Build Coastguard Worker
1025*dbb99499SAndroid Build Coastguard Worker friend class internal::BenchmarkInstance;
1026*dbb99499SAndroid Build Coastguard Worker };
1027*dbb99499SAndroid Build Coastguard Worker
KeepRunning()1028*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE bool State::KeepRunning() {
1029*dbb99499SAndroid Build Coastguard Worker return KeepRunningInternal(1, /*is_batch=*/false);
1030*dbb99499SAndroid Build Coastguard Worker }
1031*dbb99499SAndroid Build Coastguard Worker
KeepRunningBatch(IterationCount n)1032*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE bool State::KeepRunningBatch(IterationCount n) {
1033*dbb99499SAndroid Build Coastguard Worker return KeepRunningInternal(n, /*is_batch=*/true);
1034*dbb99499SAndroid Build Coastguard Worker }
1035*dbb99499SAndroid Build Coastguard Worker
KeepRunningInternal(IterationCount n,bool is_batch)1036*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE bool State::KeepRunningInternal(IterationCount n,
1037*dbb99499SAndroid Build Coastguard Worker bool is_batch) {
1038*dbb99499SAndroid Build Coastguard Worker // total_iterations_ is set to 0 by the constructor, and always set to a
1039*dbb99499SAndroid Build Coastguard Worker // nonzero value by StartKepRunning().
1040*dbb99499SAndroid Build Coastguard Worker assert(n > 0);
1041*dbb99499SAndroid Build Coastguard Worker // n must be 1 unless is_batch is true.
1042*dbb99499SAndroid Build Coastguard Worker assert(is_batch || n == 1);
1043*dbb99499SAndroid Build Coastguard Worker if (BENCHMARK_BUILTIN_EXPECT(total_iterations_ >= n, true)) {
1044*dbb99499SAndroid Build Coastguard Worker total_iterations_ -= n;
1045*dbb99499SAndroid Build Coastguard Worker return true;
1046*dbb99499SAndroid Build Coastguard Worker }
1047*dbb99499SAndroid Build Coastguard Worker if (!started_) {
1048*dbb99499SAndroid Build Coastguard Worker StartKeepRunning();
1049*dbb99499SAndroid Build Coastguard Worker if (!skipped() && total_iterations_ >= n) {
1050*dbb99499SAndroid Build Coastguard Worker total_iterations_ -= n;
1051*dbb99499SAndroid Build Coastguard Worker return true;
1052*dbb99499SAndroid Build Coastguard Worker }
1053*dbb99499SAndroid Build Coastguard Worker }
1054*dbb99499SAndroid Build Coastguard Worker // For non-batch runs, total_iterations_ must be 0 by now.
1055*dbb99499SAndroid Build Coastguard Worker if (is_batch && total_iterations_ != 0) {
1056*dbb99499SAndroid Build Coastguard Worker batch_leftover_ = n - total_iterations_;
1057*dbb99499SAndroid Build Coastguard Worker total_iterations_ = 0;
1058*dbb99499SAndroid Build Coastguard Worker return true;
1059*dbb99499SAndroid Build Coastguard Worker }
1060*dbb99499SAndroid Build Coastguard Worker FinishKeepRunning();
1061*dbb99499SAndroid Build Coastguard Worker return false;
1062*dbb99499SAndroid Build Coastguard Worker }
1063*dbb99499SAndroid Build Coastguard Worker
1064*dbb99499SAndroid Build Coastguard Worker struct State::StateIterator {
1065*dbb99499SAndroid Build Coastguard Worker struct BENCHMARK_UNUSED Value {};
1066*dbb99499SAndroid Build Coastguard Worker typedef std::forward_iterator_tag iterator_category;
1067*dbb99499SAndroid Build Coastguard Worker typedef Value value_type;
1068*dbb99499SAndroid Build Coastguard Worker typedef Value reference;
1069*dbb99499SAndroid Build Coastguard Worker typedef Value pointer;
1070*dbb99499SAndroid Build Coastguard Worker typedef std::ptrdiff_t difference_type;
1071*dbb99499SAndroid Build Coastguard Worker
1072*dbb99499SAndroid Build Coastguard Worker private:
1073*dbb99499SAndroid Build Coastguard Worker friend class State;
1074*dbb99499SAndroid Build Coastguard Worker BENCHMARK_ALWAYS_INLINE
StateIteratorStateIterator1075*dbb99499SAndroid Build Coastguard Worker StateIterator() : cached_(0), parent_() {}
1076*dbb99499SAndroid Build Coastguard Worker
1077*dbb99499SAndroid Build Coastguard Worker BENCHMARK_ALWAYS_INLINE
StateIteratorStateIterator1078*dbb99499SAndroid Build Coastguard Worker explicit StateIterator(State* st)
1079*dbb99499SAndroid Build Coastguard Worker : cached_(st->skipped() ? 0 : st->max_iterations), parent_(st) {}
1080*dbb99499SAndroid Build Coastguard Worker
1081*dbb99499SAndroid Build Coastguard Worker public:
1082*dbb99499SAndroid Build Coastguard Worker BENCHMARK_ALWAYS_INLINE
1083*dbb99499SAndroid Build Coastguard Worker Value operator*() const { return Value(); }
1084*dbb99499SAndroid Build Coastguard Worker
1085*dbb99499SAndroid Build Coastguard Worker BENCHMARK_ALWAYS_INLINE
1086*dbb99499SAndroid Build Coastguard Worker StateIterator& operator++() {
1087*dbb99499SAndroid Build Coastguard Worker assert(cached_ > 0);
1088*dbb99499SAndroid Build Coastguard Worker --cached_;
1089*dbb99499SAndroid Build Coastguard Worker return *this;
1090*dbb99499SAndroid Build Coastguard Worker }
1091*dbb99499SAndroid Build Coastguard Worker
1092*dbb99499SAndroid Build Coastguard Worker BENCHMARK_ALWAYS_INLINE
1093*dbb99499SAndroid Build Coastguard Worker bool operator!=(StateIterator const&) const {
1094*dbb99499SAndroid Build Coastguard Worker if (BENCHMARK_BUILTIN_EXPECT(cached_ != 0, true)) return true;
1095*dbb99499SAndroid Build Coastguard Worker parent_->FinishKeepRunning();
1096*dbb99499SAndroid Build Coastguard Worker return false;
1097*dbb99499SAndroid Build Coastguard Worker }
1098*dbb99499SAndroid Build Coastguard Worker
1099*dbb99499SAndroid Build Coastguard Worker private:
1100*dbb99499SAndroid Build Coastguard Worker IterationCount cached_;
1101*dbb99499SAndroid Build Coastguard Worker State* const parent_;
1102*dbb99499SAndroid Build Coastguard Worker };
1103*dbb99499SAndroid Build Coastguard Worker
begin()1104*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE State::StateIterator State::begin() {
1105*dbb99499SAndroid Build Coastguard Worker return StateIterator(this);
1106*dbb99499SAndroid Build Coastguard Worker }
end()1107*dbb99499SAndroid Build Coastguard Worker inline BENCHMARK_ALWAYS_INLINE State::StateIterator State::end() {
1108*dbb99499SAndroid Build Coastguard Worker StartKeepRunning();
1109*dbb99499SAndroid Build Coastguard Worker return StateIterator();
1110*dbb99499SAndroid Build Coastguard Worker }
1111*dbb99499SAndroid Build Coastguard Worker
1112*dbb99499SAndroid Build Coastguard Worker namespace internal {
1113*dbb99499SAndroid Build Coastguard Worker
1114*dbb99499SAndroid Build Coastguard Worker typedef void(Function)(State&);
1115*dbb99499SAndroid Build Coastguard Worker
1116*dbb99499SAndroid Build Coastguard Worker // ------------------------------------------------------
1117*dbb99499SAndroid Build Coastguard Worker // Benchmark registration object. The BENCHMARK() macro expands
1118*dbb99499SAndroid Build Coastguard Worker // into an internal::Benchmark* object. Various methods can
1119*dbb99499SAndroid Build Coastguard Worker // be called on this object to change the properties of the benchmark.
1120*dbb99499SAndroid Build Coastguard Worker // Each method returns "this" so that multiple method calls can
1121*dbb99499SAndroid Build Coastguard Worker // chained into one expression.
1122*dbb99499SAndroid Build Coastguard Worker class BENCHMARK_EXPORT Benchmark {
1123*dbb99499SAndroid Build Coastguard Worker public:
1124*dbb99499SAndroid Build Coastguard Worker virtual ~Benchmark();
1125*dbb99499SAndroid Build Coastguard Worker
1126*dbb99499SAndroid Build Coastguard Worker // Note: the following methods all return "this" so that multiple
1127*dbb99499SAndroid Build Coastguard Worker // method calls can be chained together in one expression.
1128*dbb99499SAndroid Build Coastguard Worker
1129*dbb99499SAndroid Build Coastguard Worker // Specify the name of the benchmark
1130*dbb99499SAndroid Build Coastguard Worker Benchmark* Name(const std::string& name);
1131*dbb99499SAndroid Build Coastguard Worker
1132*dbb99499SAndroid Build Coastguard Worker // Run this benchmark once with "x" as the extra argument passed
1133*dbb99499SAndroid Build Coastguard Worker // to the function.
1134*dbb99499SAndroid Build Coastguard Worker // REQUIRES: The function passed to the constructor must accept an arg1.
1135*dbb99499SAndroid Build Coastguard Worker Benchmark* Arg(int64_t x);
1136*dbb99499SAndroid Build Coastguard Worker
1137*dbb99499SAndroid Build Coastguard Worker // Run this benchmark with the given time unit for the generated output report
1138*dbb99499SAndroid Build Coastguard Worker Benchmark* Unit(TimeUnit unit);
1139*dbb99499SAndroid Build Coastguard Worker
1140*dbb99499SAndroid Build Coastguard Worker // Run this benchmark once for a number of values picked from the
1141*dbb99499SAndroid Build Coastguard Worker // range [start..limit]. (start and limit are always picked.)
1142*dbb99499SAndroid Build Coastguard Worker // REQUIRES: The function passed to the constructor must accept an arg1.
1143*dbb99499SAndroid Build Coastguard Worker Benchmark* Range(int64_t start, int64_t limit);
1144*dbb99499SAndroid Build Coastguard Worker
1145*dbb99499SAndroid Build Coastguard Worker // Run this benchmark once for all values in the range [start..limit] with
1146*dbb99499SAndroid Build Coastguard Worker // specific step
1147*dbb99499SAndroid Build Coastguard Worker // REQUIRES: The function passed to the constructor must accept an arg1.
1148*dbb99499SAndroid Build Coastguard Worker Benchmark* DenseRange(int64_t start, int64_t limit, int step = 1);
1149*dbb99499SAndroid Build Coastguard Worker
1150*dbb99499SAndroid Build Coastguard Worker // Run this benchmark once with "args" as the extra arguments passed
1151*dbb99499SAndroid Build Coastguard Worker // to the function.
1152*dbb99499SAndroid Build Coastguard Worker // REQUIRES: The function passed to the constructor must accept arg1, arg2 ...
1153*dbb99499SAndroid Build Coastguard Worker Benchmark* Args(const std::vector<int64_t>& args);
1154*dbb99499SAndroid Build Coastguard Worker
1155*dbb99499SAndroid Build Coastguard Worker // Equivalent to Args({x, y})
1156*dbb99499SAndroid Build Coastguard Worker // NOTE: This is a legacy C++03 interface provided for compatibility only.
1157*dbb99499SAndroid Build Coastguard Worker // New code should use 'Args'.
ArgPair(int64_t x,int64_t y)1158*dbb99499SAndroid Build Coastguard Worker Benchmark* ArgPair(int64_t x, int64_t y) {
1159*dbb99499SAndroid Build Coastguard Worker std::vector<int64_t> args;
1160*dbb99499SAndroid Build Coastguard Worker args.push_back(x);
1161*dbb99499SAndroid Build Coastguard Worker args.push_back(y);
1162*dbb99499SAndroid Build Coastguard Worker return Args(args);
1163*dbb99499SAndroid Build Coastguard Worker }
1164*dbb99499SAndroid Build Coastguard Worker
1165*dbb99499SAndroid Build Coastguard Worker // Run this benchmark once for a number of values picked from the
1166*dbb99499SAndroid Build Coastguard Worker // ranges [start..limit]. (starts and limits are always picked.)
1167*dbb99499SAndroid Build Coastguard Worker // REQUIRES: The function passed to the constructor must accept arg1, arg2 ...
1168*dbb99499SAndroid Build Coastguard Worker Benchmark* Ranges(const std::vector<std::pair<int64_t, int64_t> >& ranges);
1169*dbb99499SAndroid Build Coastguard Worker
1170*dbb99499SAndroid Build Coastguard Worker // Run this benchmark once for each combination of values in the (cartesian)
1171*dbb99499SAndroid Build Coastguard Worker // product of the supplied argument lists.
1172*dbb99499SAndroid Build Coastguard Worker // REQUIRES: The function passed to the constructor must accept arg1, arg2 ...
1173*dbb99499SAndroid Build Coastguard Worker Benchmark* ArgsProduct(const std::vector<std::vector<int64_t> >& arglists);
1174*dbb99499SAndroid Build Coastguard Worker
1175*dbb99499SAndroid Build Coastguard Worker // Equivalent to ArgNames({name})
1176*dbb99499SAndroid Build Coastguard Worker Benchmark* ArgName(const std::string& name);
1177*dbb99499SAndroid Build Coastguard Worker
1178*dbb99499SAndroid Build Coastguard Worker // Set the argument names to display in the benchmark name. If not called,
1179*dbb99499SAndroid Build Coastguard Worker // only argument values will be shown.
1180*dbb99499SAndroid Build Coastguard Worker Benchmark* ArgNames(const std::vector<std::string>& names);
1181*dbb99499SAndroid Build Coastguard Worker
1182*dbb99499SAndroid Build Coastguard Worker // Equivalent to Ranges({{lo1, hi1}, {lo2, hi2}}).
1183*dbb99499SAndroid Build Coastguard Worker // NOTE: This is a legacy C++03 interface provided for compatibility only.
1184*dbb99499SAndroid Build Coastguard Worker // New code should use 'Ranges'.
RangePair(int64_t lo1,int64_t hi1,int64_t lo2,int64_t hi2)1185*dbb99499SAndroid Build Coastguard Worker Benchmark* RangePair(int64_t lo1, int64_t hi1, int64_t lo2, int64_t hi2) {
1186*dbb99499SAndroid Build Coastguard Worker std::vector<std::pair<int64_t, int64_t> > ranges;
1187*dbb99499SAndroid Build Coastguard Worker ranges.push_back(std::make_pair(lo1, hi1));
1188*dbb99499SAndroid Build Coastguard Worker ranges.push_back(std::make_pair(lo2, hi2));
1189*dbb99499SAndroid Build Coastguard Worker return Ranges(ranges);
1190*dbb99499SAndroid Build Coastguard Worker }
1191*dbb99499SAndroid Build Coastguard Worker
1192*dbb99499SAndroid Build Coastguard Worker // Have "setup" and/or "teardown" invoked once for every benchmark run.
1193*dbb99499SAndroid Build Coastguard Worker // If the benchmark is multi-threaded (will run in k threads concurrently),
1194*dbb99499SAndroid Build Coastguard Worker // the setup callback will be be invoked exactly once (not k times) before
1195*dbb99499SAndroid Build Coastguard Worker // each run with k threads. Time allowing (e.g. for a short benchmark), there
1196*dbb99499SAndroid Build Coastguard Worker // may be multiple such runs per benchmark, each run with its own
1197*dbb99499SAndroid Build Coastguard Worker // "setup"/"teardown".
1198*dbb99499SAndroid Build Coastguard Worker //
1199*dbb99499SAndroid Build Coastguard Worker // If the benchmark uses different size groups of threads (e.g. via
1200*dbb99499SAndroid Build Coastguard Worker // ThreadRange), the above will be true for each size group.
1201*dbb99499SAndroid Build Coastguard Worker //
1202*dbb99499SAndroid Build Coastguard Worker // The callback will be passed a State object, which includes the number
1203*dbb99499SAndroid Build Coastguard Worker // of threads, thread-index, benchmark arguments, etc.
1204*dbb99499SAndroid Build Coastguard Worker //
1205*dbb99499SAndroid Build Coastguard Worker // The callback must not be NULL or self-deleting.
1206*dbb99499SAndroid Build Coastguard Worker Benchmark* Setup(void (*setup)(const benchmark::State&));
1207*dbb99499SAndroid Build Coastguard Worker Benchmark* Teardown(void (*teardown)(const benchmark::State&));
1208*dbb99499SAndroid Build Coastguard Worker
1209*dbb99499SAndroid Build Coastguard Worker // Pass this benchmark object to *func, which can customize
1210*dbb99499SAndroid Build Coastguard Worker // the benchmark by calling various methods like Arg, Args,
1211*dbb99499SAndroid Build Coastguard Worker // Threads, etc.
1212*dbb99499SAndroid Build Coastguard Worker Benchmark* Apply(void (*func)(Benchmark* benchmark));
1213*dbb99499SAndroid Build Coastguard Worker
1214*dbb99499SAndroid Build Coastguard Worker // Set the range multiplier for non-dense range. If not called, the range
1215*dbb99499SAndroid Build Coastguard Worker // multiplier kRangeMultiplier will be used.
1216*dbb99499SAndroid Build Coastguard Worker Benchmark* RangeMultiplier(int multiplier);
1217*dbb99499SAndroid Build Coastguard Worker
1218*dbb99499SAndroid Build Coastguard Worker // Set the minimum amount of time to use when running this benchmark. This
1219*dbb99499SAndroid Build Coastguard Worker // option overrides the `benchmark_min_time` flag.
1220*dbb99499SAndroid Build Coastguard Worker // REQUIRES: `t > 0` and `Iterations` has not been called on this benchmark.
1221*dbb99499SAndroid Build Coastguard Worker Benchmark* MinTime(double t);
1222*dbb99499SAndroid Build Coastguard Worker
1223*dbb99499SAndroid Build Coastguard Worker // Set the minimum amount of time to run the benchmark before taking runtimes
1224*dbb99499SAndroid Build Coastguard Worker // of this benchmark into account. This
1225*dbb99499SAndroid Build Coastguard Worker // option overrides the `benchmark_min_warmup_time` flag.
1226*dbb99499SAndroid Build Coastguard Worker // REQUIRES: `t >= 0` and `Iterations` has not been called on this benchmark.
1227*dbb99499SAndroid Build Coastguard Worker Benchmark* MinWarmUpTime(double t);
1228*dbb99499SAndroid Build Coastguard Worker
1229*dbb99499SAndroid Build Coastguard Worker // Specify the amount of iterations that should be run by this benchmark.
1230*dbb99499SAndroid Build Coastguard Worker // This option overrides the `benchmark_min_time` flag.
1231*dbb99499SAndroid Build Coastguard Worker // REQUIRES: 'n > 0' and `MinTime` has not been called on this benchmark.
1232*dbb99499SAndroid Build Coastguard Worker //
1233*dbb99499SAndroid Build Coastguard Worker // NOTE: This function should only be used when *exact* iteration control is
1234*dbb99499SAndroid Build Coastguard Worker // needed and never to control or limit how long a benchmark runs, where
1235*dbb99499SAndroid Build Coastguard Worker // `--benchmark_min_time=<N>s` or `MinTime(...)` should be used instead.
1236*dbb99499SAndroid Build Coastguard Worker Benchmark* Iterations(IterationCount n);
1237*dbb99499SAndroid Build Coastguard Worker
1238*dbb99499SAndroid Build Coastguard Worker // Specify the amount of times to repeat this benchmark. This option overrides
1239*dbb99499SAndroid Build Coastguard Worker // the `benchmark_repetitions` flag.
1240*dbb99499SAndroid Build Coastguard Worker // REQUIRES: `n > 0`
1241*dbb99499SAndroid Build Coastguard Worker Benchmark* Repetitions(int n);
1242*dbb99499SAndroid Build Coastguard Worker
1243*dbb99499SAndroid Build Coastguard Worker // Specify if each repetition of the benchmark should be reported separately
1244*dbb99499SAndroid Build Coastguard Worker // or if only the final statistics should be reported. If the benchmark
1245*dbb99499SAndroid Build Coastguard Worker // is not repeated then the single result is always reported.
1246*dbb99499SAndroid Build Coastguard Worker // Applies to *ALL* reporters (display and file).
1247*dbb99499SAndroid Build Coastguard Worker Benchmark* ReportAggregatesOnly(bool value = true);
1248*dbb99499SAndroid Build Coastguard Worker
1249*dbb99499SAndroid Build Coastguard Worker // Same as ReportAggregatesOnly(), but applies to display reporter only.
1250*dbb99499SAndroid Build Coastguard Worker Benchmark* DisplayAggregatesOnly(bool value = true);
1251*dbb99499SAndroid Build Coastguard Worker
1252*dbb99499SAndroid Build Coastguard Worker // By default, the CPU time is measured only for the main thread, which may
1253*dbb99499SAndroid Build Coastguard Worker // be unrepresentative if the benchmark uses threads internally. If called,
1254*dbb99499SAndroid Build Coastguard Worker // the total CPU time spent by all the threads will be measured instead.
1255*dbb99499SAndroid Build Coastguard Worker // By default, only the main thread CPU time will be measured.
1256*dbb99499SAndroid Build Coastguard Worker Benchmark* MeasureProcessCPUTime();
1257*dbb99499SAndroid Build Coastguard Worker
1258*dbb99499SAndroid Build Coastguard Worker // If a particular benchmark should use the Wall clock instead of the CPU time
1259*dbb99499SAndroid Build Coastguard Worker // (be it either the CPU time of the main thread only (default), or the
1260*dbb99499SAndroid Build Coastguard Worker // total CPU usage of the benchmark), call this method. If called, the elapsed
1261*dbb99499SAndroid Build Coastguard Worker // (wall) time will be used to control how many iterations are run, and in the
1262*dbb99499SAndroid Build Coastguard Worker // printing of items/second or MB/seconds values.
1263*dbb99499SAndroid Build Coastguard Worker // If not called, the CPU time used by the benchmark will be used.
1264*dbb99499SAndroid Build Coastguard Worker Benchmark* UseRealTime();
1265*dbb99499SAndroid Build Coastguard Worker
1266*dbb99499SAndroid Build Coastguard Worker // If a benchmark must measure time manually (e.g. if GPU execution time is
1267*dbb99499SAndroid Build Coastguard Worker // being
1268*dbb99499SAndroid Build Coastguard Worker // measured), call this method. If called, each benchmark iteration should
1269*dbb99499SAndroid Build Coastguard Worker // call
1270*dbb99499SAndroid Build Coastguard Worker // SetIterationTime(seconds) to report the measured time, which will be used
1271*dbb99499SAndroid Build Coastguard Worker // to control how many iterations are run, and in the printing of items/second
1272*dbb99499SAndroid Build Coastguard Worker // or MB/second values.
1273*dbb99499SAndroid Build Coastguard Worker Benchmark* UseManualTime();
1274*dbb99499SAndroid Build Coastguard Worker
1275*dbb99499SAndroid Build Coastguard Worker // Set the asymptotic computational complexity for the benchmark. If called
1276*dbb99499SAndroid Build Coastguard Worker // the asymptotic computational complexity will be shown on the output.
1277*dbb99499SAndroid Build Coastguard Worker Benchmark* Complexity(BigO complexity = benchmark::oAuto);
1278*dbb99499SAndroid Build Coastguard Worker
1279*dbb99499SAndroid Build Coastguard Worker // Set the asymptotic computational complexity for the benchmark. If called
1280*dbb99499SAndroid Build Coastguard Worker // the asymptotic computational complexity will be shown on the output.
1281*dbb99499SAndroid Build Coastguard Worker Benchmark* Complexity(BigOFunc* complexity);
1282*dbb99499SAndroid Build Coastguard Worker
1283*dbb99499SAndroid Build Coastguard Worker // Add this statistics to be computed over all the values of benchmark run
1284*dbb99499SAndroid Build Coastguard Worker Benchmark* ComputeStatistics(const std::string& name,
1285*dbb99499SAndroid Build Coastguard Worker StatisticsFunc* statistics,
1286*dbb99499SAndroid Build Coastguard Worker StatisticUnit unit = kTime);
1287*dbb99499SAndroid Build Coastguard Worker
1288*dbb99499SAndroid Build Coastguard Worker // Support for running multiple copies of the same benchmark concurrently
1289*dbb99499SAndroid Build Coastguard Worker // in multiple threads. This may be useful when measuring the scaling
1290*dbb99499SAndroid Build Coastguard Worker // of some piece of code.
1291*dbb99499SAndroid Build Coastguard Worker
1292*dbb99499SAndroid Build Coastguard Worker // Run one instance of this benchmark concurrently in t threads.
1293*dbb99499SAndroid Build Coastguard Worker Benchmark* Threads(int t);
1294*dbb99499SAndroid Build Coastguard Worker
1295*dbb99499SAndroid Build Coastguard Worker // Pick a set of values T from [min_threads,max_threads].
1296*dbb99499SAndroid Build Coastguard Worker // min_threads and max_threads are always included in T. Run this
1297*dbb99499SAndroid Build Coastguard Worker // benchmark once for each value in T. The benchmark run for a
1298*dbb99499SAndroid Build Coastguard Worker // particular value t consists of t threads running the benchmark
1299*dbb99499SAndroid Build Coastguard Worker // function concurrently. For example, consider:
1300*dbb99499SAndroid Build Coastguard Worker // BENCHMARK(Foo)->ThreadRange(1,16);
1301*dbb99499SAndroid Build Coastguard Worker // This will run the following benchmarks:
1302*dbb99499SAndroid Build Coastguard Worker // Foo in 1 thread
1303*dbb99499SAndroid Build Coastguard Worker // Foo in 2 threads
1304*dbb99499SAndroid Build Coastguard Worker // Foo in 4 threads
1305*dbb99499SAndroid Build Coastguard Worker // Foo in 8 threads
1306*dbb99499SAndroid Build Coastguard Worker // Foo in 16 threads
1307*dbb99499SAndroid Build Coastguard Worker Benchmark* ThreadRange(int min_threads, int max_threads);
1308*dbb99499SAndroid Build Coastguard Worker
1309*dbb99499SAndroid Build Coastguard Worker // For each value n in the range, run this benchmark once using n threads.
1310*dbb99499SAndroid Build Coastguard Worker // min_threads and max_threads are always included in the range.
1311*dbb99499SAndroid Build Coastguard Worker // stride specifies the increment. E.g. DenseThreadRange(1, 8, 3) starts
1312*dbb99499SAndroid Build Coastguard Worker // a benchmark with 1, 4, 7 and 8 threads.
1313*dbb99499SAndroid Build Coastguard Worker Benchmark* DenseThreadRange(int min_threads, int max_threads, int stride = 1);
1314*dbb99499SAndroid Build Coastguard Worker
1315*dbb99499SAndroid Build Coastguard Worker // Equivalent to ThreadRange(NumCPUs(), NumCPUs())
1316*dbb99499SAndroid Build Coastguard Worker Benchmark* ThreadPerCpu();
1317*dbb99499SAndroid Build Coastguard Worker
1318*dbb99499SAndroid Build Coastguard Worker virtual void Run(State& state) = 0;
1319*dbb99499SAndroid Build Coastguard Worker
1320*dbb99499SAndroid Build Coastguard Worker TimeUnit GetTimeUnit() const;
1321*dbb99499SAndroid Build Coastguard Worker
1322*dbb99499SAndroid Build Coastguard Worker protected:
1323*dbb99499SAndroid Build Coastguard Worker explicit Benchmark(const std::string& name);
1324*dbb99499SAndroid Build Coastguard Worker void SetName(const std::string& name);
1325*dbb99499SAndroid Build Coastguard Worker
1326*dbb99499SAndroid Build Coastguard Worker public:
1327*dbb99499SAndroid Build Coastguard Worker const char* GetName() const;
1328*dbb99499SAndroid Build Coastguard Worker int ArgsCnt() const;
1329*dbb99499SAndroid Build Coastguard Worker const char* GetArgName(int arg) const;
1330*dbb99499SAndroid Build Coastguard Worker
1331*dbb99499SAndroid Build Coastguard Worker private:
1332*dbb99499SAndroid Build Coastguard Worker friend class BenchmarkFamilies;
1333*dbb99499SAndroid Build Coastguard Worker friend class BenchmarkInstance;
1334*dbb99499SAndroid Build Coastguard Worker
1335*dbb99499SAndroid Build Coastguard Worker std::string name_;
1336*dbb99499SAndroid Build Coastguard Worker AggregationReportMode aggregation_report_mode_;
1337*dbb99499SAndroid Build Coastguard Worker std::vector<std::string> arg_names_; // Args for all benchmark runs
1338*dbb99499SAndroid Build Coastguard Worker std::vector<std::vector<int64_t> > args_; // Args for all benchmark runs
1339*dbb99499SAndroid Build Coastguard Worker
1340*dbb99499SAndroid Build Coastguard Worker TimeUnit time_unit_;
1341*dbb99499SAndroid Build Coastguard Worker bool use_default_time_unit_;
1342*dbb99499SAndroid Build Coastguard Worker
1343*dbb99499SAndroid Build Coastguard Worker int range_multiplier_;
1344*dbb99499SAndroid Build Coastguard Worker double min_time_;
1345*dbb99499SAndroid Build Coastguard Worker double min_warmup_time_;
1346*dbb99499SAndroid Build Coastguard Worker IterationCount iterations_;
1347*dbb99499SAndroid Build Coastguard Worker int repetitions_;
1348*dbb99499SAndroid Build Coastguard Worker bool measure_process_cpu_time_;
1349*dbb99499SAndroid Build Coastguard Worker bool use_real_time_;
1350*dbb99499SAndroid Build Coastguard Worker bool use_manual_time_;
1351*dbb99499SAndroid Build Coastguard Worker BigO complexity_;
1352*dbb99499SAndroid Build Coastguard Worker BigOFunc* complexity_lambda_;
1353*dbb99499SAndroid Build Coastguard Worker std::vector<Statistics> statistics_;
1354*dbb99499SAndroid Build Coastguard Worker std::vector<int> thread_counts_;
1355*dbb99499SAndroid Build Coastguard Worker
1356*dbb99499SAndroid Build Coastguard Worker typedef void (*callback_function)(const benchmark::State&);
1357*dbb99499SAndroid Build Coastguard Worker callback_function setup_;
1358*dbb99499SAndroid Build Coastguard Worker callback_function teardown_;
1359*dbb99499SAndroid Build Coastguard Worker
1360*dbb99499SAndroid Build Coastguard Worker Benchmark(Benchmark const&)
1361*dbb99499SAndroid Build Coastguard Worker #if defined(BENCHMARK_HAS_CXX11)
1362*dbb99499SAndroid Build Coastguard Worker = delete
1363*dbb99499SAndroid Build Coastguard Worker #endif
1364*dbb99499SAndroid Build Coastguard Worker ;
1365*dbb99499SAndroid Build Coastguard Worker
1366*dbb99499SAndroid Build Coastguard Worker Benchmark& operator=(Benchmark const&)
1367*dbb99499SAndroid Build Coastguard Worker #if defined(BENCHMARK_HAS_CXX11)
1368*dbb99499SAndroid Build Coastguard Worker = delete
1369*dbb99499SAndroid Build Coastguard Worker #endif
1370*dbb99499SAndroid Build Coastguard Worker ;
1371*dbb99499SAndroid Build Coastguard Worker };
1372*dbb99499SAndroid Build Coastguard Worker
1373*dbb99499SAndroid Build Coastguard Worker } // namespace internal
1374*dbb99499SAndroid Build Coastguard Worker
1375*dbb99499SAndroid Build Coastguard Worker // Create and register a benchmark with the specified 'name' that invokes
1376*dbb99499SAndroid Build Coastguard Worker // the specified functor 'fn'.
1377*dbb99499SAndroid Build Coastguard Worker //
1378*dbb99499SAndroid Build Coastguard Worker // RETURNS: A pointer to the registered benchmark.
1379*dbb99499SAndroid Build Coastguard Worker internal::Benchmark* RegisterBenchmark(const std::string& name,
1380*dbb99499SAndroid Build Coastguard Worker internal::Function* fn);
1381*dbb99499SAndroid Build Coastguard Worker
1382*dbb99499SAndroid Build Coastguard Worker #if defined(BENCHMARK_HAS_CXX11)
1383*dbb99499SAndroid Build Coastguard Worker template <class Lambda>
1384*dbb99499SAndroid Build Coastguard Worker internal::Benchmark* RegisterBenchmark(const std::string& name, Lambda&& fn);
1385*dbb99499SAndroid Build Coastguard Worker #endif
1386*dbb99499SAndroid Build Coastguard Worker
1387*dbb99499SAndroid Build Coastguard Worker // Remove all registered benchmarks. All pointers to previously registered
1388*dbb99499SAndroid Build Coastguard Worker // benchmarks are invalidated.
1389*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT void ClearRegisteredBenchmarks();
1390*dbb99499SAndroid Build Coastguard Worker
1391*dbb99499SAndroid Build Coastguard Worker namespace internal {
1392*dbb99499SAndroid Build Coastguard Worker // The class used to hold all Benchmarks created from static function.
1393*dbb99499SAndroid Build Coastguard Worker // (ie those created using the BENCHMARK(...) macros.
1394*dbb99499SAndroid Build Coastguard Worker class BENCHMARK_EXPORT FunctionBenchmark : public Benchmark {
1395*dbb99499SAndroid Build Coastguard Worker public:
FunctionBenchmark(const std::string & name,Function * func)1396*dbb99499SAndroid Build Coastguard Worker FunctionBenchmark(const std::string& name, Function* func)
1397*dbb99499SAndroid Build Coastguard Worker : Benchmark(name), func_(func) {}
1398*dbb99499SAndroid Build Coastguard Worker
1399*dbb99499SAndroid Build Coastguard Worker void Run(State& st) BENCHMARK_OVERRIDE;
1400*dbb99499SAndroid Build Coastguard Worker
1401*dbb99499SAndroid Build Coastguard Worker private:
1402*dbb99499SAndroid Build Coastguard Worker Function* func_;
1403*dbb99499SAndroid Build Coastguard Worker };
1404*dbb99499SAndroid Build Coastguard Worker
1405*dbb99499SAndroid Build Coastguard Worker #ifdef BENCHMARK_HAS_CXX11
1406*dbb99499SAndroid Build Coastguard Worker template <class Lambda>
1407*dbb99499SAndroid Build Coastguard Worker class LambdaBenchmark : public Benchmark {
1408*dbb99499SAndroid Build Coastguard Worker public:
Run(State & st)1409*dbb99499SAndroid Build Coastguard Worker void Run(State& st) BENCHMARK_OVERRIDE { lambda_(st); }
1410*dbb99499SAndroid Build Coastguard Worker
1411*dbb99499SAndroid Build Coastguard Worker private:
1412*dbb99499SAndroid Build Coastguard Worker template <class OLambda>
LambdaBenchmark(const std::string & name,OLambda && lam)1413*dbb99499SAndroid Build Coastguard Worker LambdaBenchmark(const std::string& name, OLambda&& lam)
1414*dbb99499SAndroid Build Coastguard Worker : Benchmark(name), lambda_(std::forward<OLambda>(lam)) {}
1415*dbb99499SAndroid Build Coastguard Worker
1416*dbb99499SAndroid Build Coastguard Worker LambdaBenchmark(LambdaBenchmark const&) = delete;
1417*dbb99499SAndroid Build Coastguard Worker
1418*dbb99499SAndroid Build Coastguard Worker template <class Lam> // NOLINTNEXTLINE(readability-redundant-declaration)
1419*dbb99499SAndroid Build Coastguard Worker friend Benchmark* ::benchmark::RegisterBenchmark(const std::string&, Lam&&);
1420*dbb99499SAndroid Build Coastguard Worker
1421*dbb99499SAndroid Build Coastguard Worker Lambda lambda_;
1422*dbb99499SAndroid Build Coastguard Worker };
1423*dbb99499SAndroid Build Coastguard Worker #endif
1424*dbb99499SAndroid Build Coastguard Worker } // namespace internal
1425*dbb99499SAndroid Build Coastguard Worker
RegisterBenchmark(const std::string & name,internal::Function * fn)1426*dbb99499SAndroid Build Coastguard Worker inline internal::Benchmark* RegisterBenchmark(const std::string& name,
1427*dbb99499SAndroid Build Coastguard Worker internal::Function* fn) {
1428*dbb99499SAndroid Build Coastguard Worker // FIXME: this should be a `std::make_unique<>()` but we don't have C++14.
1429*dbb99499SAndroid Build Coastguard Worker // codechecker_intentional [cplusplus.NewDeleteLeaks]
1430*dbb99499SAndroid Build Coastguard Worker return internal::RegisterBenchmarkInternal(
1431*dbb99499SAndroid Build Coastguard Worker ::new internal::FunctionBenchmark(name, fn));
1432*dbb99499SAndroid Build Coastguard Worker }
1433*dbb99499SAndroid Build Coastguard Worker
1434*dbb99499SAndroid Build Coastguard Worker #ifdef BENCHMARK_HAS_CXX11
1435*dbb99499SAndroid Build Coastguard Worker template <class Lambda>
RegisterBenchmark(const std::string & name,Lambda && fn)1436*dbb99499SAndroid Build Coastguard Worker internal::Benchmark* RegisterBenchmark(const std::string& name, Lambda&& fn) {
1437*dbb99499SAndroid Build Coastguard Worker using BenchType =
1438*dbb99499SAndroid Build Coastguard Worker internal::LambdaBenchmark<typename std::decay<Lambda>::type>;
1439*dbb99499SAndroid Build Coastguard Worker // FIXME: this should be a `std::make_unique<>()` but we don't have C++14.
1440*dbb99499SAndroid Build Coastguard Worker // codechecker_intentional [cplusplus.NewDeleteLeaks]
1441*dbb99499SAndroid Build Coastguard Worker return internal::RegisterBenchmarkInternal(
1442*dbb99499SAndroid Build Coastguard Worker ::new BenchType(name, std::forward<Lambda>(fn)));
1443*dbb99499SAndroid Build Coastguard Worker }
1444*dbb99499SAndroid Build Coastguard Worker #endif
1445*dbb99499SAndroid Build Coastguard Worker
1446*dbb99499SAndroid Build Coastguard Worker #if defined(BENCHMARK_HAS_CXX11) && \
1447*dbb99499SAndroid Build Coastguard Worker (!defined(BENCHMARK_GCC_VERSION) || BENCHMARK_GCC_VERSION >= 409)
1448*dbb99499SAndroid Build Coastguard Worker template <class Lambda, class... Args>
RegisterBenchmark(const std::string & name,Lambda && fn,Args &&...args)1449*dbb99499SAndroid Build Coastguard Worker internal::Benchmark* RegisterBenchmark(const std::string& name, Lambda&& fn,
1450*dbb99499SAndroid Build Coastguard Worker Args&&... args) {
1451*dbb99499SAndroid Build Coastguard Worker return benchmark::RegisterBenchmark(
1452*dbb99499SAndroid Build Coastguard Worker name, [=](benchmark::State& st) { fn(st, args...); });
1453*dbb99499SAndroid Build Coastguard Worker }
1454*dbb99499SAndroid Build Coastguard Worker #else
1455*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_HAS_NO_VARIADIC_REGISTER_BENCHMARK
1456*dbb99499SAndroid Build Coastguard Worker #endif
1457*dbb99499SAndroid Build Coastguard Worker
1458*dbb99499SAndroid Build Coastguard Worker // The base class for all fixture tests.
1459*dbb99499SAndroid Build Coastguard Worker class Fixture : public internal::Benchmark {
1460*dbb99499SAndroid Build Coastguard Worker public:
Fixture()1461*dbb99499SAndroid Build Coastguard Worker Fixture() : internal::Benchmark("") {}
1462*dbb99499SAndroid Build Coastguard Worker
Run(State & st)1463*dbb99499SAndroid Build Coastguard Worker void Run(State& st) BENCHMARK_OVERRIDE {
1464*dbb99499SAndroid Build Coastguard Worker this->SetUp(st);
1465*dbb99499SAndroid Build Coastguard Worker this->BenchmarkCase(st);
1466*dbb99499SAndroid Build Coastguard Worker this->TearDown(st);
1467*dbb99499SAndroid Build Coastguard Worker }
1468*dbb99499SAndroid Build Coastguard Worker
1469*dbb99499SAndroid Build Coastguard Worker // These will be deprecated ...
SetUp(const State &)1470*dbb99499SAndroid Build Coastguard Worker virtual void SetUp(const State&) {}
TearDown(const State &)1471*dbb99499SAndroid Build Coastguard Worker virtual void TearDown(const State&) {}
1472*dbb99499SAndroid Build Coastguard Worker // ... In favor of these.
SetUp(State & st)1473*dbb99499SAndroid Build Coastguard Worker virtual void SetUp(State& st) { SetUp(const_cast<const State&>(st)); }
TearDown(State & st)1474*dbb99499SAndroid Build Coastguard Worker virtual void TearDown(State& st) { TearDown(const_cast<const State&>(st)); }
1475*dbb99499SAndroid Build Coastguard Worker
1476*dbb99499SAndroid Build Coastguard Worker protected:
1477*dbb99499SAndroid Build Coastguard Worker virtual void BenchmarkCase(State&) = 0;
1478*dbb99499SAndroid Build Coastguard Worker };
1479*dbb99499SAndroid Build Coastguard Worker } // namespace benchmark
1480*dbb99499SAndroid Build Coastguard Worker
1481*dbb99499SAndroid Build Coastguard Worker // ------------------------------------------------------
1482*dbb99499SAndroid Build Coastguard Worker // Macro to register benchmarks
1483*dbb99499SAndroid Build Coastguard Worker
1484*dbb99499SAndroid Build Coastguard Worker // Check that __COUNTER__ is defined and that __COUNTER__ increases by 1
1485*dbb99499SAndroid Build Coastguard Worker // every time it is expanded. X + 1 == X + 0 is used in case X is defined to be
1486*dbb99499SAndroid Build Coastguard Worker // empty. If X is empty the expression becomes (+1 == +0).
1487*dbb99499SAndroid Build Coastguard Worker #if defined(__COUNTER__) && (__COUNTER__ + 1 == __COUNTER__ + 0)
1488*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_PRIVATE_UNIQUE_ID __COUNTER__
1489*dbb99499SAndroid Build Coastguard Worker #else
1490*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_PRIVATE_UNIQUE_ID __LINE__
1491*dbb99499SAndroid Build Coastguard Worker #endif
1492*dbb99499SAndroid Build Coastguard Worker
1493*dbb99499SAndroid Build Coastguard Worker // Helpers for generating unique variable names
1494*dbb99499SAndroid Build Coastguard Worker #ifdef BENCHMARK_HAS_CXX11
1495*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_PRIVATE_NAME(...) \
1496*dbb99499SAndroid Build Coastguard Worker BENCHMARK_PRIVATE_CONCAT(benchmark_uniq_, BENCHMARK_PRIVATE_UNIQUE_ID, \
1497*dbb99499SAndroid Build Coastguard Worker __VA_ARGS__)
1498*dbb99499SAndroid Build Coastguard Worker #else
1499*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_PRIVATE_NAME(n) \
1500*dbb99499SAndroid Build Coastguard Worker BENCHMARK_PRIVATE_CONCAT(benchmark_uniq_, BENCHMARK_PRIVATE_UNIQUE_ID, n)
1501*dbb99499SAndroid Build Coastguard Worker #endif // BENCHMARK_HAS_CXX11
1502*dbb99499SAndroid Build Coastguard Worker
1503*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_PRIVATE_CONCAT(a, b, c) BENCHMARK_PRIVATE_CONCAT2(a, b, c)
1504*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_PRIVATE_CONCAT2(a, b, c) a##b##c
1505*dbb99499SAndroid Build Coastguard Worker // Helper for concatenation with macro name expansion
1506*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method) \
1507*dbb99499SAndroid Build Coastguard Worker BaseClass##_##Method##_Benchmark
1508*dbb99499SAndroid Build Coastguard Worker
1509*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_PRIVATE_DECLARE(n) \
1510*dbb99499SAndroid Build Coastguard Worker static ::benchmark::internal::Benchmark* BENCHMARK_PRIVATE_NAME(n) \
1511*dbb99499SAndroid Build Coastguard Worker BENCHMARK_UNUSED
1512*dbb99499SAndroid Build Coastguard Worker
1513*dbb99499SAndroid Build Coastguard Worker #ifdef BENCHMARK_HAS_CXX11
1514*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK(...) \
1515*dbb99499SAndroid Build Coastguard Worker BENCHMARK_PRIVATE_DECLARE(_benchmark_) = \
1516*dbb99499SAndroid Build Coastguard Worker (::benchmark::internal::RegisterBenchmarkInternal( \
1517*dbb99499SAndroid Build Coastguard Worker new ::benchmark::internal::FunctionBenchmark(#__VA_ARGS__, \
1518*dbb99499SAndroid Build Coastguard Worker __VA_ARGS__)))
1519*dbb99499SAndroid Build Coastguard Worker #else
1520*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK(n) \
1521*dbb99499SAndroid Build Coastguard Worker BENCHMARK_PRIVATE_DECLARE(n) = \
1522*dbb99499SAndroid Build Coastguard Worker (::benchmark::internal::RegisterBenchmarkInternal( \
1523*dbb99499SAndroid Build Coastguard Worker new ::benchmark::internal::FunctionBenchmark(#n, n)))
1524*dbb99499SAndroid Build Coastguard Worker #endif // BENCHMARK_HAS_CXX11
1525*dbb99499SAndroid Build Coastguard Worker
1526*dbb99499SAndroid Build Coastguard Worker // Old-style macros
1527*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_WITH_ARG(n, a) BENCHMARK(n)->Arg((a))
1528*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_WITH_ARG2(n, a1, a2) BENCHMARK(n)->Args({(a1), (a2)})
1529*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_WITH_UNIT(n, t) BENCHMARK(n)->Unit((t))
1530*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_RANGE(n, lo, hi) BENCHMARK(n)->Range((lo), (hi))
1531*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_RANGE2(n, l1, h1, l2, h2) \
1532*dbb99499SAndroid Build Coastguard Worker BENCHMARK(n)->RangePair({{(l1), (h1)}, {(l2), (h2)}})
1533*dbb99499SAndroid Build Coastguard Worker
1534*dbb99499SAndroid Build Coastguard Worker #ifdef BENCHMARK_HAS_CXX11
1535*dbb99499SAndroid Build Coastguard Worker
1536*dbb99499SAndroid Build Coastguard Worker // Register a benchmark which invokes the function specified by `func`
1537*dbb99499SAndroid Build Coastguard Worker // with the additional arguments specified by `...`.
1538*dbb99499SAndroid Build Coastguard Worker //
1539*dbb99499SAndroid Build Coastguard Worker // For example:
1540*dbb99499SAndroid Build Coastguard Worker //
1541*dbb99499SAndroid Build Coastguard Worker // template <class ...ExtraArgs>`
1542*dbb99499SAndroid Build Coastguard Worker // void BM_takes_args(benchmark::State& state, ExtraArgs&&... extra_args) {
1543*dbb99499SAndroid Build Coastguard Worker // [...]
1544*dbb99499SAndroid Build Coastguard Worker //}
1545*dbb99499SAndroid Build Coastguard Worker // /* Registers a benchmark named "BM_takes_args/int_string_test` */
1546*dbb99499SAndroid Build Coastguard Worker // BENCHMARK_CAPTURE(BM_takes_args, int_string_test, 42, std::string("abc"));
1547*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_CAPTURE(func, test_case_name, ...) \
1548*dbb99499SAndroid Build Coastguard Worker BENCHMARK_PRIVATE_DECLARE(_benchmark_) = \
1549*dbb99499SAndroid Build Coastguard Worker (::benchmark::internal::RegisterBenchmarkInternal( \
1550*dbb99499SAndroid Build Coastguard Worker new ::benchmark::internal::FunctionBenchmark( \
1551*dbb99499SAndroid Build Coastguard Worker #func "/" #test_case_name, \
1552*dbb99499SAndroid Build Coastguard Worker [](::benchmark::State& st) { func(st, __VA_ARGS__); })))
1553*dbb99499SAndroid Build Coastguard Worker
1554*dbb99499SAndroid Build Coastguard Worker #endif // BENCHMARK_HAS_CXX11
1555*dbb99499SAndroid Build Coastguard Worker
1556*dbb99499SAndroid Build Coastguard Worker // This will register a benchmark for a templatized function. For example:
1557*dbb99499SAndroid Build Coastguard Worker //
1558*dbb99499SAndroid Build Coastguard Worker // template<int arg>
1559*dbb99499SAndroid Build Coastguard Worker // void BM_Foo(int iters);
1560*dbb99499SAndroid Build Coastguard Worker //
1561*dbb99499SAndroid Build Coastguard Worker // BENCHMARK_TEMPLATE(BM_Foo, 1);
1562*dbb99499SAndroid Build Coastguard Worker //
1563*dbb99499SAndroid Build Coastguard Worker // will register BM_Foo<1> as a benchmark.
1564*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_TEMPLATE1(n, a) \
1565*dbb99499SAndroid Build Coastguard Worker BENCHMARK_PRIVATE_DECLARE(n) = \
1566*dbb99499SAndroid Build Coastguard Worker (::benchmark::internal::RegisterBenchmarkInternal( \
1567*dbb99499SAndroid Build Coastguard Worker new ::benchmark::internal::FunctionBenchmark(#n "<" #a ">", n<a>)))
1568*dbb99499SAndroid Build Coastguard Worker
1569*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_TEMPLATE2(n, a, b) \
1570*dbb99499SAndroid Build Coastguard Worker BENCHMARK_PRIVATE_DECLARE(n) = \
1571*dbb99499SAndroid Build Coastguard Worker (::benchmark::internal::RegisterBenchmarkInternal( \
1572*dbb99499SAndroid Build Coastguard Worker new ::benchmark::internal::FunctionBenchmark(#n "<" #a "," #b ">", \
1573*dbb99499SAndroid Build Coastguard Worker n<a, b>)))
1574*dbb99499SAndroid Build Coastguard Worker
1575*dbb99499SAndroid Build Coastguard Worker #ifdef BENCHMARK_HAS_CXX11
1576*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_TEMPLATE(n, ...) \
1577*dbb99499SAndroid Build Coastguard Worker BENCHMARK_PRIVATE_DECLARE(n) = \
1578*dbb99499SAndroid Build Coastguard Worker (::benchmark::internal::RegisterBenchmarkInternal( \
1579*dbb99499SAndroid Build Coastguard Worker new ::benchmark::internal::FunctionBenchmark( \
1580*dbb99499SAndroid Build Coastguard Worker #n "<" #__VA_ARGS__ ">", n<__VA_ARGS__>)))
1581*dbb99499SAndroid Build Coastguard Worker #else
1582*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_TEMPLATE(n, a) BENCHMARK_TEMPLATE1(n, a)
1583*dbb99499SAndroid Build Coastguard Worker #endif
1584*dbb99499SAndroid Build Coastguard Worker
1585*dbb99499SAndroid Build Coastguard Worker #ifdef BENCHMARK_HAS_CXX11
1586*dbb99499SAndroid Build Coastguard Worker // This will register a benchmark for a templatized function,
1587*dbb99499SAndroid Build Coastguard Worker // with the additional arguments specified by `...`.
1588*dbb99499SAndroid Build Coastguard Worker //
1589*dbb99499SAndroid Build Coastguard Worker // For example:
1590*dbb99499SAndroid Build Coastguard Worker //
1591*dbb99499SAndroid Build Coastguard Worker // template <typename T, class ...ExtraArgs>`
1592*dbb99499SAndroid Build Coastguard Worker // void BM_takes_args(benchmark::State& state, ExtraArgs&&... extra_args) {
1593*dbb99499SAndroid Build Coastguard Worker // [...]
1594*dbb99499SAndroid Build Coastguard Worker //}
1595*dbb99499SAndroid Build Coastguard Worker // /* Registers a benchmark named "BM_takes_args<void>/int_string_test` */
1596*dbb99499SAndroid Build Coastguard Worker // BENCHMARK_TEMPLATE1_CAPTURE(BM_takes_args, void, int_string_test, 42,
1597*dbb99499SAndroid Build Coastguard Worker // std::string("abc"));
1598*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_TEMPLATE1_CAPTURE(func, a, test_case_name, ...) \
1599*dbb99499SAndroid Build Coastguard Worker BENCHMARK_CAPTURE(func<a>, test_case_name, __VA_ARGS__)
1600*dbb99499SAndroid Build Coastguard Worker
1601*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_TEMPLATE2_CAPTURE(func, a, b, test_case_name, ...) \
1602*dbb99499SAndroid Build Coastguard Worker BENCHMARK_PRIVATE_DECLARE(func) = \
1603*dbb99499SAndroid Build Coastguard Worker (::benchmark::internal::RegisterBenchmarkInternal( \
1604*dbb99499SAndroid Build Coastguard Worker new ::benchmark::internal::FunctionBenchmark( \
1605*dbb99499SAndroid Build Coastguard Worker #func "<" #a "," #b ">" \
1606*dbb99499SAndroid Build Coastguard Worker "/" #test_case_name, \
1607*dbb99499SAndroid Build Coastguard Worker [](::benchmark::State& st) { func<a, b>(st, __VA_ARGS__); })))
1608*dbb99499SAndroid Build Coastguard Worker #endif // BENCHMARK_HAS_CXX11
1609*dbb99499SAndroid Build Coastguard Worker
1610*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_PRIVATE_DECLARE_F(BaseClass, Method) \
1611*dbb99499SAndroid Build Coastguard Worker class BaseClass##_##Method##_Benchmark : public BaseClass { \
1612*dbb99499SAndroid Build Coastguard Worker public: \
1613*dbb99499SAndroid Build Coastguard Worker BaseClass##_##Method##_Benchmark() { \
1614*dbb99499SAndroid Build Coastguard Worker this->SetName(#BaseClass "/" #Method); \
1615*dbb99499SAndroid Build Coastguard Worker } \
1616*dbb99499SAndroid Build Coastguard Worker \
1617*dbb99499SAndroid Build Coastguard Worker protected: \
1618*dbb99499SAndroid Build Coastguard Worker void BenchmarkCase(::benchmark::State&) BENCHMARK_OVERRIDE; \
1619*dbb99499SAndroid Build Coastguard Worker };
1620*dbb99499SAndroid Build Coastguard Worker
1621*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_TEMPLATE1_PRIVATE_DECLARE_F(BaseClass, Method, a) \
1622*dbb99499SAndroid Build Coastguard Worker class BaseClass##_##Method##_Benchmark : public BaseClass<a> { \
1623*dbb99499SAndroid Build Coastguard Worker public: \
1624*dbb99499SAndroid Build Coastguard Worker BaseClass##_##Method##_Benchmark() { \
1625*dbb99499SAndroid Build Coastguard Worker this->SetName(#BaseClass "<" #a ">/" #Method); \
1626*dbb99499SAndroid Build Coastguard Worker } \
1627*dbb99499SAndroid Build Coastguard Worker \
1628*dbb99499SAndroid Build Coastguard Worker protected: \
1629*dbb99499SAndroid Build Coastguard Worker void BenchmarkCase(::benchmark::State&) BENCHMARK_OVERRIDE; \
1630*dbb99499SAndroid Build Coastguard Worker };
1631*dbb99499SAndroid Build Coastguard Worker
1632*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_TEMPLATE2_PRIVATE_DECLARE_F(BaseClass, Method, a, b) \
1633*dbb99499SAndroid Build Coastguard Worker class BaseClass##_##Method##_Benchmark : public BaseClass<a, b> { \
1634*dbb99499SAndroid Build Coastguard Worker public: \
1635*dbb99499SAndroid Build Coastguard Worker BaseClass##_##Method##_Benchmark() { \
1636*dbb99499SAndroid Build Coastguard Worker this->SetName(#BaseClass "<" #a "," #b ">/" #Method); \
1637*dbb99499SAndroid Build Coastguard Worker } \
1638*dbb99499SAndroid Build Coastguard Worker \
1639*dbb99499SAndroid Build Coastguard Worker protected: \
1640*dbb99499SAndroid Build Coastguard Worker void BenchmarkCase(::benchmark::State&) BENCHMARK_OVERRIDE; \
1641*dbb99499SAndroid Build Coastguard Worker };
1642*dbb99499SAndroid Build Coastguard Worker
1643*dbb99499SAndroid Build Coastguard Worker #ifdef BENCHMARK_HAS_CXX11
1644*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_TEMPLATE_PRIVATE_DECLARE_F(BaseClass, Method, ...) \
1645*dbb99499SAndroid Build Coastguard Worker class BaseClass##_##Method##_Benchmark : public BaseClass<__VA_ARGS__> { \
1646*dbb99499SAndroid Build Coastguard Worker public: \
1647*dbb99499SAndroid Build Coastguard Worker BaseClass##_##Method##_Benchmark() { \
1648*dbb99499SAndroid Build Coastguard Worker this->SetName(#BaseClass "<" #__VA_ARGS__ ">/" #Method); \
1649*dbb99499SAndroid Build Coastguard Worker } \
1650*dbb99499SAndroid Build Coastguard Worker \
1651*dbb99499SAndroid Build Coastguard Worker protected: \
1652*dbb99499SAndroid Build Coastguard Worker void BenchmarkCase(::benchmark::State&) BENCHMARK_OVERRIDE; \
1653*dbb99499SAndroid Build Coastguard Worker };
1654*dbb99499SAndroid Build Coastguard Worker #else
1655*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_TEMPLATE_PRIVATE_DECLARE_F(n, a) \
1656*dbb99499SAndroid Build Coastguard Worker BENCHMARK_TEMPLATE1_PRIVATE_DECLARE_F(n, a)
1657*dbb99499SAndroid Build Coastguard Worker #endif
1658*dbb99499SAndroid Build Coastguard Worker
1659*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_DEFINE_F(BaseClass, Method) \
1660*dbb99499SAndroid Build Coastguard Worker BENCHMARK_PRIVATE_DECLARE_F(BaseClass, Method) \
1661*dbb99499SAndroid Build Coastguard Worker void BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method)::BenchmarkCase
1662*dbb99499SAndroid Build Coastguard Worker
1663*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_TEMPLATE1_DEFINE_F(BaseClass, Method, a) \
1664*dbb99499SAndroid Build Coastguard Worker BENCHMARK_TEMPLATE1_PRIVATE_DECLARE_F(BaseClass, Method, a) \
1665*dbb99499SAndroid Build Coastguard Worker void BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method)::BenchmarkCase
1666*dbb99499SAndroid Build Coastguard Worker
1667*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_TEMPLATE2_DEFINE_F(BaseClass, Method, a, b) \
1668*dbb99499SAndroid Build Coastguard Worker BENCHMARK_TEMPLATE2_PRIVATE_DECLARE_F(BaseClass, Method, a, b) \
1669*dbb99499SAndroid Build Coastguard Worker void BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method)::BenchmarkCase
1670*dbb99499SAndroid Build Coastguard Worker
1671*dbb99499SAndroid Build Coastguard Worker #ifdef BENCHMARK_HAS_CXX11
1672*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_TEMPLATE_DEFINE_F(BaseClass, Method, ...) \
1673*dbb99499SAndroid Build Coastguard Worker BENCHMARK_TEMPLATE_PRIVATE_DECLARE_F(BaseClass, Method, __VA_ARGS__) \
1674*dbb99499SAndroid Build Coastguard Worker void BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method)::BenchmarkCase
1675*dbb99499SAndroid Build Coastguard Worker #else
1676*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_TEMPLATE_DEFINE_F(BaseClass, Method, a) \
1677*dbb99499SAndroid Build Coastguard Worker BENCHMARK_TEMPLATE1_DEFINE_F(BaseClass, Method, a)
1678*dbb99499SAndroid Build Coastguard Worker #endif
1679*dbb99499SAndroid Build Coastguard Worker
1680*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_REGISTER_F(BaseClass, Method) \
1681*dbb99499SAndroid Build Coastguard Worker BENCHMARK_PRIVATE_REGISTER_F(BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method))
1682*dbb99499SAndroid Build Coastguard Worker
1683*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_PRIVATE_REGISTER_F(TestName) \
1684*dbb99499SAndroid Build Coastguard Worker BENCHMARK_PRIVATE_DECLARE(TestName) = \
1685*dbb99499SAndroid Build Coastguard Worker (::benchmark::internal::RegisterBenchmarkInternal(new TestName()))
1686*dbb99499SAndroid Build Coastguard Worker
1687*dbb99499SAndroid Build Coastguard Worker // This macro will define and register a benchmark within a fixture class.
1688*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_F(BaseClass, Method) \
1689*dbb99499SAndroid Build Coastguard Worker BENCHMARK_PRIVATE_DECLARE_F(BaseClass, Method) \
1690*dbb99499SAndroid Build Coastguard Worker BENCHMARK_REGISTER_F(BaseClass, Method); \
1691*dbb99499SAndroid Build Coastguard Worker void BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method)::BenchmarkCase
1692*dbb99499SAndroid Build Coastguard Worker
1693*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_TEMPLATE1_F(BaseClass, Method, a) \
1694*dbb99499SAndroid Build Coastguard Worker BENCHMARK_TEMPLATE1_PRIVATE_DECLARE_F(BaseClass, Method, a) \
1695*dbb99499SAndroid Build Coastguard Worker BENCHMARK_REGISTER_F(BaseClass, Method); \
1696*dbb99499SAndroid Build Coastguard Worker void BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method)::BenchmarkCase
1697*dbb99499SAndroid Build Coastguard Worker
1698*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_TEMPLATE2_F(BaseClass, Method, a, b) \
1699*dbb99499SAndroid Build Coastguard Worker BENCHMARK_TEMPLATE2_PRIVATE_DECLARE_F(BaseClass, Method, a, b) \
1700*dbb99499SAndroid Build Coastguard Worker BENCHMARK_REGISTER_F(BaseClass, Method); \
1701*dbb99499SAndroid Build Coastguard Worker void BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method)::BenchmarkCase
1702*dbb99499SAndroid Build Coastguard Worker
1703*dbb99499SAndroid Build Coastguard Worker #ifdef BENCHMARK_HAS_CXX11
1704*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_TEMPLATE_F(BaseClass, Method, ...) \
1705*dbb99499SAndroid Build Coastguard Worker BENCHMARK_TEMPLATE_PRIVATE_DECLARE_F(BaseClass, Method, __VA_ARGS__) \
1706*dbb99499SAndroid Build Coastguard Worker BENCHMARK_REGISTER_F(BaseClass, Method); \
1707*dbb99499SAndroid Build Coastguard Worker void BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method)::BenchmarkCase
1708*dbb99499SAndroid Build Coastguard Worker #else
1709*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_TEMPLATE_F(BaseClass, Method, a) \
1710*dbb99499SAndroid Build Coastguard Worker BENCHMARK_TEMPLATE1_F(BaseClass, Method, a)
1711*dbb99499SAndroid Build Coastguard Worker #endif
1712*dbb99499SAndroid Build Coastguard Worker
1713*dbb99499SAndroid Build Coastguard Worker // Helper macro to create a main routine in a test that runs the benchmarks
1714*dbb99499SAndroid Build Coastguard Worker // Note the workaround for Hexagon simulator passing argc != 0, argv = NULL.
1715*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_MAIN() \
1716*dbb99499SAndroid Build Coastguard Worker int main(int argc, char** argv) { \
1717*dbb99499SAndroid Build Coastguard Worker char arg0_default[] = "benchmark"; \
1718*dbb99499SAndroid Build Coastguard Worker char* args_default = arg0_default; \
1719*dbb99499SAndroid Build Coastguard Worker if (!argv) { \
1720*dbb99499SAndroid Build Coastguard Worker argc = 1; \
1721*dbb99499SAndroid Build Coastguard Worker argv = &args_default; \
1722*dbb99499SAndroid Build Coastguard Worker } \
1723*dbb99499SAndroid Build Coastguard Worker ::benchmark::Initialize(&argc, argv); \
1724*dbb99499SAndroid Build Coastguard Worker if (::benchmark::ReportUnrecognizedArguments(argc, argv)) return 1; \
1725*dbb99499SAndroid Build Coastguard Worker ::benchmark::RunSpecifiedBenchmarks(); \
1726*dbb99499SAndroid Build Coastguard Worker ::benchmark::Shutdown(); \
1727*dbb99499SAndroid Build Coastguard Worker return 0; \
1728*dbb99499SAndroid Build Coastguard Worker } \
1729*dbb99499SAndroid Build Coastguard Worker int main(int, char**)
1730*dbb99499SAndroid Build Coastguard Worker
1731*dbb99499SAndroid Build Coastguard Worker // ------------------------------------------------------
1732*dbb99499SAndroid Build Coastguard Worker // Benchmark Reporters
1733*dbb99499SAndroid Build Coastguard Worker
1734*dbb99499SAndroid Build Coastguard Worker namespace benchmark {
1735*dbb99499SAndroid Build Coastguard Worker
1736*dbb99499SAndroid Build Coastguard Worker struct BENCHMARK_EXPORT CPUInfo {
1737*dbb99499SAndroid Build Coastguard Worker struct CacheInfo {
1738*dbb99499SAndroid Build Coastguard Worker std::string type;
1739*dbb99499SAndroid Build Coastguard Worker int level;
1740*dbb99499SAndroid Build Coastguard Worker int size;
1741*dbb99499SAndroid Build Coastguard Worker int num_sharing;
1742*dbb99499SAndroid Build Coastguard Worker };
1743*dbb99499SAndroid Build Coastguard Worker
1744*dbb99499SAndroid Build Coastguard Worker enum Scaling { UNKNOWN, ENABLED, DISABLED };
1745*dbb99499SAndroid Build Coastguard Worker
1746*dbb99499SAndroid Build Coastguard Worker int num_cpus;
1747*dbb99499SAndroid Build Coastguard Worker Scaling scaling;
1748*dbb99499SAndroid Build Coastguard Worker double cycles_per_second;
1749*dbb99499SAndroid Build Coastguard Worker std::vector<CacheInfo> caches;
1750*dbb99499SAndroid Build Coastguard Worker std::vector<double> load_avg;
1751*dbb99499SAndroid Build Coastguard Worker
1752*dbb99499SAndroid Build Coastguard Worker static const CPUInfo& Get();
1753*dbb99499SAndroid Build Coastguard Worker
1754*dbb99499SAndroid Build Coastguard Worker private:
1755*dbb99499SAndroid Build Coastguard Worker CPUInfo();
1756*dbb99499SAndroid Build Coastguard Worker BENCHMARK_DISALLOW_COPY_AND_ASSIGN(CPUInfo);
1757*dbb99499SAndroid Build Coastguard Worker };
1758*dbb99499SAndroid Build Coastguard Worker
1759*dbb99499SAndroid Build Coastguard Worker // Adding Struct for System Information
1760*dbb99499SAndroid Build Coastguard Worker struct BENCHMARK_EXPORT SystemInfo {
1761*dbb99499SAndroid Build Coastguard Worker std::string name;
1762*dbb99499SAndroid Build Coastguard Worker static const SystemInfo& Get();
1763*dbb99499SAndroid Build Coastguard Worker
1764*dbb99499SAndroid Build Coastguard Worker private:
1765*dbb99499SAndroid Build Coastguard Worker SystemInfo();
1766*dbb99499SAndroid Build Coastguard Worker BENCHMARK_DISALLOW_COPY_AND_ASSIGN(SystemInfo);
1767*dbb99499SAndroid Build Coastguard Worker };
1768*dbb99499SAndroid Build Coastguard Worker
1769*dbb99499SAndroid Build Coastguard Worker // BenchmarkName contains the components of the Benchmark's name
1770*dbb99499SAndroid Build Coastguard Worker // which allows individual fields to be modified or cleared before
1771*dbb99499SAndroid Build Coastguard Worker // building the final name using 'str()'.
1772*dbb99499SAndroid Build Coastguard Worker struct BENCHMARK_EXPORT BenchmarkName {
1773*dbb99499SAndroid Build Coastguard Worker std::string function_name;
1774*dbb99499SAndroid Build Coastguard Worker std::string args;
1775*dbb99499SAndroid Build Coastguard Worker std::string min_time;
1776*dbb99499SAndroid Build Coastguard Worker std::string min_warmup_time;
1777*dbb99499SAndroid Build Coastguard Worker std::string iterations;
1778*dbb99499SAndroid Build Coastguard Worker std::string repetitions;
1779*dbb99499SAndroid Build Coastguard Worker std::string time_type;
1780*dbb99499SAndroid Build Coastguard Worker std::string threads;
1781*dbb99499SAndroid Build Coastguard Worker
1782*dbb99499SAndroid Build Coastguard Worker // Return the full name of the benchmark with each non-empty
1783*dbb99499SAndroid Build Coastguard Worker // field separated by a '/'
1784*dbb99499SAndroid Build Coastguard Worker std::string str() const;
1785*dbb99499SAndroid Build Coastguard Worker };
1786*dbb99499SAndroid Build Coastguard Worker
1787*dbb99499SAndroid Build Coastguard Worker // Interface for custom benchmark result printers.
1788*dbb99499SAndroid Build Coastguard Worker // By default, benchmark reports are printed to stdout. However an application
1789*dbb99499SAndroid Build Coastguard Worker // can control the destination of the reports by calling
1790*dbb99499SAndroid Build Coastguard Worker // RunSpecifiedBenchmarks and passing it a custom reporter object.
1791*dbb99499SAndroid Build Coastguard Worker // The reporter object must implement the following interface.
1792*dbb99499SAndroid Build Coastguard Worker class BENCHMARK_EXPORT BenchmarkReporter {
1793*dbb99499SAndroid Build Coastguard Worker public:
1794*dbb99499SAndroid Build Coastguard Worker struct Context {
1795*dbb99499SAndroid Build Coastguard Worker CPUInfo const& cpu_info;
1796*dbb99499SAndroid Build Coastguard Worker SystemInfo const& sys_info;
1797*dbb99499SAndroid Build Coastguard Worker // The number of chars in the longest benchmark name.
1798*dbb99499SAndroid Build Coastguard Worker size_t name_field_width;
1799*dbb99499SAndroid Build Coastguard Worker static const char* executable_name;
1800*dbb99499SAndroid Build Coastguard Worker Context();
1801*dbb99499SAndroid Build Coastguard Worker };
1802*dbb99499SAndroid Build Coastguard Worker
1803*dbb99499SAndroid Build Coastguard Worker struct BENCHMARK_EXPORT Run {
1804*dbb99499SAndroid Build Coastguard Worker static const int64_t no_repetition_index = -1;
1805*dbb99499SAndroid Build Coastguard Worker enum RunType { RT_Iteration, RT_Aggregate };
1806*dbb99499SAndroid Build Coastguard Worker
RunRun1807*dbb99499SAndroid Build Coastguard Worker Run()
1808*dbb99499SAndroid Build Coastguard Worker : run_type(RT_Iteration),
1809*dbb99499SAndroid Build Coastguard Worker aggregate_unit(kTime),
1810*dbb99499SAndroid Build Coastguard Worker skipped(internal::NotSkipped),
1811*dbb99499SAndroid Build Coastguard Worker iterations(1),
1812*dbb99499SAndroid Build Coastguard Worker threads(1),
1813*dbb99499SAndroid Build Coastguard Worker time_unit(GetDefaultTimeUnit()),
1814*dbb99499SAndroid Build Coastguard Worker real_accumulated_time(0),
1815*dbb99499SAndroid Build Coastguard Worker cpu_accumulated_time(0),
1816*dbb99499SAndroid Build Coastguard Worker max_heapbytes_used(0),
1817*dbb99499SAndroid Build Coastguard Worker use_real_time_for_initial_big_o(false),
1818*dbb99499SAndroid Build Coastguard Worker complexity(oNone),
1819*dbb99499SAndroid Build Coastguard Worker complexity_lambda(),
1820*dbb99499SAndroid Build Coastguard Worker complexity_n(0),
1821*dbb99499SAndroid Build Coastguard Worker report_big_o(false),
1822*dbb99499SAndroid Build Coastguard Worker report_rms(false),
1823*dbb99499SAndroid Build Coastguard Worker memory_result(NULL),
1824*dbb99499SAndroid Build Coastguard Worker allocs_per_iter(0.0) {}
1825*dbb99499SAndroid Build Coastguard Worker
1826*dbb99499SAndroid Build Coastguard Worker std::string benchmark_name() const;
1827*dbb99499SAndroid Build Coastguard Worker BenchmarkName run_name;
1828*dbb99499SAndroid Build Coastguard Worker int64_t family_index;
1829*dbb99499SAndroid Build Coastguard Worker int64_t per_family_instance_index;
1830*dbb99499SAndroid Build Coastguard Worker RunType run_type;
1831*dbb99499SAndroid Build Coastguard Worker std::string aggregate_name;
1832*dbb99499SAndroid Build Coastguard Worker StatisticUnit aggregate_unit;
1833*dbb99499SAndroid Build Coastguard Worker std::string report_label; // Empty if not set by benchmark.
1834*dbb99499SAndroid Build Coastguard Worker internal::Skipped skipped;
1835*dbb99499SAndroid Build Coastguard Worker std::string skip_message;
1836*dbb99499SAndroid Build Coastguard Worker
1837*dbb99499SAndroid Build Coastguard Worker IterationCount iterations;
1838*dbb99499SAndroid Build Coastguard Worker int64_t threads;
1839*dbb99499SAndroid Build Coastguard Worker int64_t repetition_index;
1840*dbb99499SAndroid Build Coastguard Worker int64_t repetitions;
1841*dbb99499SAndroid Build Coastguard Worker TimeUnit time_unit;
1842*dbb99499SAndroid Build Coastguard Worker double real_accumulated_time;
1843*dbb99499SAndroid Build Coastguard Worker double cpu_accumulated_time;
1844*dbb99499SAndroid Build Coastguard Worker
1845*dbb99499SAndroid Build Coastguard Worker // Return a value representing the real time per iteration in the unit
1846*dbb99499SAndroid Build Coastguard Worker // specified by 'time_unit'.
1847*dbb99499SAndroid Build Coastguard Worker // NOTE: If 'iterations' is zero the returned value represents the
1848*dbb99499SAndroid Build Coastguard Worker // accumulated time.
1849*dbb99499SAndroid Build Coastguard Worker double GetAdjustedRealTime() const;
1850*dbb99499SAndroid Build Coastguard Worker
1851*dbb99499SAndroid Build Coastguard Worker // Return a value representing the cpu time per iteration in the unit
1852*dbb99499SAndroid Build Coastguard Worker // specified by 'time_unit'.
1853*dbb99499SAndroid Build Coastguard Worker // NOTE: If 'iterations' is zero the returned value represents the
1854*dbb99499SAndroid Build Coastguard Worker // accumulated time.
1855*dbb99499SAndroid Build Coastguard Worker double GetAdjustedCPUTime() const;
1856*dbb99499SAndroid Build Coastguard Worker
1857*dbb99499SAndroid Build Coastguard Worker // This is set to 0.0 if memory tracing is not enabled.
1858*dbb99499SAndroid Build Coastguard Worker double max_heapbytes_used;
1859*dbb99499SAndroid Build Coastguard Worker
1860*dbb99499SAndroid Build Coastguard Worker // By default Big-O is computed for CPU time, but that is not what you want
1861*dbb99499SAndroid Build Coastguard Worker // to happen when manual time was requested, which is stored as real time.
1862*dbb99499SAndroid Build Coastguard Worker bool use_real_time_for_initial_big_o;
1863*dbb99499SAndroid Build Coastguard Worker
1864*dbb99499SAndroid Build Coastguard Worker // Keep track of arguments to compute asymptotic complexity
1865*dbb99499SAndroid Build Coastguard Worker BigO complexity;
1866*dbb99499SAndroid Build Coastguard Worker BigOFunc* complexity_lambda;
1867*dbb99499SAndroid Build Coastguard Worker ComplexityN complexity_n;
1868*dbb99499SAndroid Build Coastguard Worker
1869*dbb99499SAndroid Build Coastguard Worker // what statistics to compute from the measurements
1870*dbb99499SAndroid Build Coastguard Worker const std::vector<internal::Statistics>* statistics;
1871*dbb99499SAndroid Build Coastguard Worker
1872*dbb99499SAndroid Build Coastguard Worker // Inform print function whether the current run is a complexity report
1873*dbb99499SAndroid Build Coastguard Worker bool report_big_o;
1874*dbb99499SAndroid Build Coastguard Worker bool report_rms;
1875*dbb99499SAndroid Build Coastguard Worker
1876*dbb99499SAndroid Build Coastguard Worker UserCounters counters;
1877*dbb99499SAndroid Build Coastguard Worker
1878*dbb99499SAndroid Build Coastguard Worker // Memory metrics.
1879*dbb99499SAndroid Build Coastguard Worker const MemoryManager::Result* memory_result;
1880*dbb99499SAndroid Build Coastguard Worker double allocs_per_iter;
1881*dbb99499SAndroid Build Coastguard Worker };
1882*dbb99499SAndroid Build Coastguard Worker
1883*dbb99499SAndroid Build Coastguard Worker struct PerFamilyRunReports {
PerFamilyRunReportsPerFamilyRunReports1884*dbb99499SAndroid Build Coastguard Worker PerFamilyRunReports() : num_runs_total(0), num_runs_done(0) {}
1885*dbb99499SAndroid Build Coastguard Worker
1886*dbb99499SAndroid Build Coastguard Worker // How many runs will all instances of this benchmark perform?
1887*dbb99499SAndroid Build Coastguard Worker int num_runs_total;
1888*dbb99499SAndroid Build Coastguard Worker
1889*dbb99499SAndroid Build Coastguard Worker // How many runs have happened already?
1890*dbb99499SAndroid Build Coastguard Worker int num_runs_done;
1891*dbb99499SAndroid Build Coastguard Worker
1892*dbb99499SAndroid Build Coastguard Worker // The reports about (non-errneous!) runs of this family.
1893*dbb99499SAndroid Build Coastguard Worker std::vector<BenchmarkReporter::Run> Runs;
1894*dbb99499SAndroid Build Coastguard Worker };
1895*dbb99499SAndroid Build Coastguard Worker
1896*dbb99499SAndroid Build Coastguard Worker // Construct a BenchmarkReporter with the output stream set to 'std::cout'
1897*dbb99499SAndroid Build Coastguard Worker // and the error stream set to 'std::cerr'
1898*dbb99499SAndroid Build Coastguard Worker BenchmarkReporter();
1899*dbb99499SAndroid Build Coastguard Worker
1900*dbb99499SAndroid Build Coastguard Worker // Called once for every suite of benchmarks run.
1901*dbb99499SAndroid Build Coastguard Worker // The parameter "context" contains information that the
1902*dbb99499SAndroid Build Coastguard Worker // reporter may wish to use when generating its report, for example the
1903*dbb99499SAndroid Build Coastguard Worker // platform under which the benchmarks are running. The benchmark run is
1904*dbb99499SAndroid Build Coastguard Worker // never started if this function returns false, allowing the reporter
1905*dbb99499SAndroid Build Coastguard Worker // to skip runs based on the context information.
1906*dbb99499SAndroid Build Coastguard Worker virtual bool ReportContext(const Context& context) = 0;
1907*dbb99499SAndroid Build Coastguard Worker
1908*dbb99499SAndroid Build Coastguard Worker // Called once for each group of benchmark runs, gives information about
1909*dbb99499SAndroid Build Coastguard Worker // the configurations of the runs.
ReportRunsConfig(double,bool,IterationCount)1910*dbb99499SAndroid Build Coastguard Worker virtual void ReportRunsConfig(double /*min_time*/,
1911*dbb99499SAndroid Build Coastguard Worker bool /*has_explicit_iters*/,
1912*dbb99499SAndroid Build Coastguard Worker IterationCount /*iters*/) {}
1913*dbb99499SAndroid Build Coastguard Worker
1914*dbb99499SAndroid Build Coastguard Worker // Called once for each group of benchmark runs, gives information about
1915*dbb99499SAndroid Build Coastguard Worker // cpu-time and heap memory usage during the benchmark run. If the group
1916*dbb99499SAndroid Build Coastguard Worker // of runs contained more than two entries then 'report' contains additional
1917*dbb99499SAndroid Build Coastguard Worker // elements representing the mean and standard deviation of those runs.
1918*dbb99499SAndroid Build Coastguard Worker // Additionally if this group of runs was the last in a family of benchmarks
1919*dbb99499SAndroid Build Coastguard Worker // 'reports' contains additional entries representing the asymptotic
1920*dbb99499SAndroid Build Coastguard Worker // complexity and RMS of that benchmark family.
1921*dbb99499SAndroid Build Coastguard Worker virtual void ReportRuns(const std::vector<Run>& report) = 0;
1922*dbb99499SAndroid Build Coastguard Worker
1923*dbb99499SAndroid Build Coastguard Worker // Called once and only once after ever group of benchmarks is run and
1924*dbb99499SAndroid Build Coastguard Worker // reported.
Finalize()1925*dbb99499SAndroid Build Coastguard Worker virtual void Finalize() {}
1926*dbb99499SAndroid Build Coastguard Worker
1927*dbb99499SAndroid Build Coastguard Worker // REQUIRES: The object referenced by 'out' is valid for the lifetime
1928*dbb99499SAndroid Build Coastguard Worker // of the reporter.
SetOutputStream(std::ostream * out)1929*dbb99499SAndroid Build Coastguard Worker void SetOutputStream(std::ostream* out) {
1930*dbb99499SAndroid Build Coastguard Worker assert(out);
1931*dbb99499SAndroid Build Coastguard Worker output_stream_ = out;
1932*dbb99499SAndroid Build Coastguard Worker }
1933*dbb99499SAndroid Build Coastguard Worker
1934*dbb99499SAndroid Build Coastguard Worker // REQUIRES: The object referenced by 'err' is valid for the lifetime
1935*dbb99499SAndroid Build Coastguard Worker // of the reporter.
SetErrorStream(std::ostream * err)1936*dbb99499SAndroid Build Coastguard Worker void SetErrorStream(std::ostream* err) {
1937*dbb99499SAndroid Build Coastguard Worker assert(err);
1938*dbb99499SAndroid Build Coastguard Worker error_stream_ = err;
1939*dbb99499SAndroid Build Coastguard Worker }
1940*dbb99499SAndroid Build Coastguard Worker
GetOutputStream()1941*dbb99499SAndroid Build Coastguard Worker std::ostream& GetOutputStream() const { return *output_stream_; }
1942*dbb99499SAndroid Build Coastguard Worker
GetErrorStream()1943*dbb99499SAndroid Build Coastguard Worker std::ostream& GetErrorStream() const { return *error_stream_; }
1944*dbb99499SAndroid Build Coastguard Worker
1945*dbb99499SAndroid Build Coastguard Worker virtual ~BenchmarkReporter();
1946*dbb99499SAndroid Build Coastguard Worker
1947*dbb99499SAndroid Build Coastguard Worker // Write a human readable string to 'out' representing the specified
1948*dbb99499SAndroid Build Coastguard Worker // 'context'.
1949*dbb99499SAndroid Build Coastguard Worker // REQUIRES: 'out' is non-null.
1950*dbb99499SAndroid Build Coastguard Worker static void PrintBasicContext(std::ostream* out, Context const& context);
1951*dbb99499SAndroid Build Coastguard Worker
1952*dbb99499SAndroid Build Coastguard Worker private:
1953*dbb99499SAndroid Build Coastguard Worker std::ostream* output_stream_;
1954*dbb99499SAndroid Build Coastguard Worker std::ostream* error_stream_;
1955*dbb99499SAndroid Build Coastguard Worker };
1956*dbb99499SAndroid Build Coastguard Worker
1957*dbb99499SAndroid Build Coastguard Worker // Simple reporter that outputs benchmark data to the console. This is the
1958*dbb99499SAndroid Build Coastguard Worker // default reporter used by RunSpecifiedBenchmarks().
1959*dbb99499SAndroid Build Coastguard Worker class BENCHMARK_EXPORT ConsoleReporter : public BenchmarkReporter {
1960*dbb99499SAndroid Build Coastguard Worker public:
1961*dbb99499SAndroid Build Coastguard Worker enum OutputOptions {
1962*dbb99499SAndroid Build Coastguard Worker OO_None = 0,
1963*dbb99499SAndroid Build Coastguard Worker OO_Color = 1,
1964*dbb99499SAndroid Build Coastguard Worker OO_Tabular = 2,
1965*dbb99499SAndroid Build Coastguard Worker OO_ColorTabular = OO_Color | OO_Tabular,
1966*dbb99499SAndroid Build Coastguard Worker OO_Defaults = OO_ColorTabular
1967*dbb99499SAndroid Build Coastguard Worker };
1968*dbb99499SAndroid Build Coastguard Worker explicit ConsoleReporter(OutputOptions opts_ = OO_Defaults)
output_options_(opts_)1969*dbb99499SAndroid Build Coastguard Worker : output_options_(opts_), name_field_width_(0), printed_header_(false) {}
1970*dbb99499SAndroid Build Coastguard Worker
1971*dbb99499SAndroid Build Coastguard Worker bool ReportContext(const Context& context) BENCHMARK_OVERRIDE;
1972*dbb99499SAndroid Build Coastguard Worker void ReportRuns(const std::vector<Run>& reports) BENCHMARK_OVERRIDE;
1973*dbb99499SAndroid Build Coastguard Worker
1974*dbb99499SAndroid Build Coastguard Worker protected:
1975*dbb99499SAndroid Build Coastguard Worker virtual void PrintRunData(const Run& report);
1976*dbb99499SAndroid Build Coastguard Worker virtual void PrintHeader(const Run& report);
1977*dbb99499SAndroid Build Coastguard Worker
1978*dbb99499SAndroid Build Coastguard Worker OutputOptions output_options_;
1979*dbb99499SAndroid Build Coastguard Worker size_t name_field_width_;
1980*dbb99499SAndroid Build Coastguard Worker UserCounters prev_counters_;
1981*dbb99499SAndroid Build Coastguard Worker bool printed_header_;
1982*dbb99499SAndroid Build Coastguard Worker };
1983*dbb99499SAndroid Build Coastguard Worker
1984*dbb99499SAndroid Build Coastguard Worker class BENCHMARK_EXPORT JSONReporter : public BenchmarkReporter {
1985*dbb99499SAndroid Build Coastguard Worker public:
JSONReporter()1986*dbb99499SAndroid Build Coastguard Worker JSONReporter() : first_report_(true) {}
1987*dbb99499SAndroid Build Coastguard Worker bool ReportContext(const Context& context) BENCHMARK_OVERRIDE;
1988*dbb99499SAndroid Build Coastguard Worker void ReportRuns(const std::vector<Run>& reports) BENCHMARK_OVERRIDE;
1989*dbb99499SAndroid Build Coastguard Worker void Finalize() BENCHMARK_OVERRIDE;
1990*dbb99499SAndroid Build Coastguard Worker
1991*dbb99499SAndroid Build Coastguard Worker private:
1992*dbb99499SAndroid Build Coastguard Worker void PrintRunData(const Run& report);
1993*dbb99499SAndroid Build Coastguard Worker
1994*dbb99499SAndroid Build Coastguard Worker bool first_report_;
1995*dbb99499SAndroid Build Coastguard Worker };
1996*dbb99499SAndroid Build Coastguard Worker
1997*dbb99499SAndroid Build Coastguard Worker class BENCHMARK_EXPORT BENCHMARK_DEPRECATED_MSG(
1998*dbb99499SAndroid Build Coastguard Worker "The CSV Reporter will be removed in a future release") CSVReporter
1999*dbb99499SAndroid Build Coastguard Worker : public BenchmarkReporter {
2000*dbb99499SAndroid Build Coastguard Worker public:
CSVReporter()2001*dbb99499SAndroid Build Coastguard Worker CSVReporter() : printed_header_(false) {}
2002*dbb99499SAndroid Build Coastguard Worker bool ReportContext(const Context& context) BENCHMARK_OVERRIDE;
2003*dbb99499SAndroid Build Coastguard Worker void ReportRuns(const std::vector<Run>& reports) BENCHMARK_OVERRIDE;
2004*dbb99499SAndroid Build Coastguard Worker
2005*dbb99499SAndroid Build Coastguard Worker private:
2006*dbb99499SAndroid Build Coastguard Worker void PrintRunData(const Run& report);
2007*dbb99499SAndroid Build Coastguard Worker
2008*dbb99499SAndroid Build Coastguard Worker bool printed_header_;
2009*dbb99499SAndroid Build Coastguard Worker std::set<std::string> user_counter_names_;
2010*dbb99499SAndroid Build Coastguard Worker };
2011*dbb99499SAndroid Build Coastguard Worker
GetTimeUnitString(TimeUnit unit)2012*dbb99499SAndroid Build Coastguard Worker inline const char* GetTimeUnitString(TimeUnit unit) {
2013*dbb99499SAndroid Build Coastguard Worker switch (unit) {
2014*dbb99499SAndroid Build Coastguard Worker case kSecond:
2015*dbb99499SAndroid Build Coastguard Worker return "s";
2016*dbb99499SAndroid Build Coastguard Worker case kMillisecond:
2017*dbb99499SAndroid Build Coastguard Worker return "ms";
2018*dbb99499SAndroid Build Coastguard Worker case kMicrosecond:
2019*dbb99499SAndroid Build Coastguard Worker return "us";
2020*dbb99499SAndroid Build Coastguard Worker case kNanosecond:
2021*dbb99499SAndroid Build Coastguard Worker return "ns";
2022*dbb99499SAndroid Build Coastguard Worker }
2023*dbb99499SAndroid Build Coastguard Worker BENCHMARK_UNREACHABLE();
2024*dbb99499SAndroid Build Coastguard Worker }
2025*dbb99499SAndroid Build Coastguard Worker
GetTimeUnitMultiplier(TimeUnit unit)2026*dbb99499SAndroid Build Coastguard Worker inline double GetTimeUnitMultiplier(TimeUnit unit) {
2027*dbb99499SAndroid Build Coastguard Worker switch (unit) {
2028*dbb99499SAndroid Build Coastguard Worker case kSecond:
2029*dbb99499SAndroid Build Coastguard Worker return 1;
2030*dbb99499SAndroid Build Coastguard Worker case kMillisecond:
2031*dbb99499SAndroid Build Coastguard Worker return 1e3;
2032*dbb99499SAndroid Build Coastguard Worker case kMicrosecond:
2033*dbb99499SAndroid Build Coastguard Worker return 1e6;
2034*dbb99499SAndroid Build Coastguard Worker case kNanosecond:
2035*dbb99499SAndroid Build Coastguard Worker return 1e9;
2036*dbb99499SAndroid Build Coastguard Worker }
2037*dbb99499SAndroid Build Coastguard Worker BENCHMARK_UNREACHABLE();
2038*dbb99499SAndroid Build Coastguard Worker }
2039*dbb99499SAndroid Build Coastguard Worker
2040*dbb99499SAndroid Build Coastguard Worker // Creates a list of integer values for the given range and multiplier.
2041*dbb99499SAndroid Build Coastguard Worker // This can be used together with ArgsProduct() to allow multiple ranges
2042*dbb99499SAndroid Build Coastguard Worker // with different multipliers.
2043*dbb99499SAndroid Build Coastguard Worker // Example:
2044*dbb99499SAndroid Build Coastguard Worker // ArgsProduct({
2045*dbb99499SAndroid Build Coastguard Worker // CreateRange(0, 1024, /*multi=*/32),
2046*dbb99499SAndroid Build Coastguard Worker // CreateRange(0, 100, /*multi=*/4),
2047*dbb99499SAndroid Build Coastguard Worker // CreateDenseRange(0, 4, /*step=*/1),
2048*dbb99499SAndroid Build Coastguard Worker // });
2049*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT
2050*dbb99499SAndroid Build Coastguard Worker std::vector<int64_t> CreateRange(int64_t lo, int64_t hi, int multi);
2051*dbb99499SAndroid Build Coastguard Worker
2052*dbb99499SAndroid Build Coastguard Worker // Creates a list of integer values for the given range and step.
2053*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT
2054*dbb99499SAndroid Build Coastguard Worker std::vector<int64_t> CreateDenseRange(int64_t start, int64_t limit, int step);
2055*dbb99499SAndroid Build Coastguard Worker
2056*dbb99499SAndroid Build Coastguard Worker } // namespace benchmark
2057*dbb99499SAndroid Build Coastguard Worker
2058*dbb99499SAndroid Build Coastguard Worker #if defined(_MSC_VER)
2059*dbb99499SAndroid Build Coastguard Worker #pragma warning(pop)
2060*dbb99499SAndroid Build Coastguard Worker #endif
2061*dbb99499SAndroid Build Coastguard Worker
2062*dbb99499SAndroid Build Coastguard Worker #endif // BENCHMARK_BENCHMARK_H_
2063