xref: /aosp_15_r20/external/google-benchmark/docs/user_guide.md (revision dbb99499c3810fa1611fa2242a2fc446be01a57c)
1*dbb99499SAndroid Build Coastguard Worker# User Guide
2*dbb99499SAndroid Build Coastguard Worker
3*dbb99499SAndroid Build Coastguard Worker## Command Line
4*dbb99499SAndroid Build Coastguard Worker
5*dbb99499SAndroid Build Coastguard Worker[Output Formats](#output-formats)
6*dbb99499SAndroid Build Coastguard Worker
7*dbb99499SAndroid Build Coastguard Worker[Output Files](#output-files)
8*dbb99499SAndroid Build Coastguard Worker
9*dbb99499SAndroid Build Coastguard Worker[Running Benchmarks](#running-benchmarks)
10*dbb99499SAndroid Build Coastguard Worker
11*dbb99499SAndroid Build Coastguard Worker[Running a Subset of Benchmarks](#running-a-subset-of-benchmarks)
12*dbb99499SAndroid Build Coastguard Worker
13*dbb99499SAndroid Build Coastguard Worker[Result Comparison](#result-comparison)
14*dbb99499SAndroid Build Coastguard Worker
15*dbb99499SAndroid Build Coastguard Worker[Extra Context](#extra-context)
16*dbb99499SAndroid Build Coastguard Worker
17*dbb99499SAndroid Build Coastguard Worker## Library
18*dbb99499SAndroid Build Coastguard Worker
19*dbb99499SAndroid Build Coastguard Worker[Runtime and Reporting Considerations](#runtime-and-reporting-considerations)
20*dbb99499SAndroid Build Coastguard Worker
21*dbb99499SAndroid Build Coastguard Worker[Setup/Teardown](#setupteardown)
22*dbb99499SAndroid Build Coastguard Worker
23*dbb99499SAndroid Build Coastguard Worker[Passing Arguments](#passing-arguments)
24*dbb99499SAndroid Build Coastguard Worker
25*dbb99499SAndroid Build Coastguard Worker[Custom Benchmark Name](#custom-benchmark-name)
26*dbb99499SAndroid Build Coastguard Worker
27*dbb99499SAndroid Build Coastguard Worker[Calculating Asymptotic Complexity](#asymptotic-complexity)
28*dbb99499SAndroid Build Coastguard Worker
29*dbb99499SAndroid Build Coastguard Worker[Templated Benchmarks](#templated-benchmarks)
30*dbb99499SAndroid Build Coastguard Worker
31*dbb99499SAndroid Build Coastguard Worker[Templated Benchmarks that take arguments](#templated-benchmarks-with-arguments)
32*dbb99499SAndroid Build Coastguard Worker
33*dbb99499SAndroid Build Coastguard Worker[Fixtures](#fixtures)
34*dbb99499SAndroid Build Coastguard Worker
35*dbb99499SAndroid Build Coastguard Worker[Custom Counters](#custom-counters)
36*dbb99499SAndroid Build Coastguard Worker
37*dbb99499SAndroid Build Coastguard Worker[Multithreaded Benchmarks](#multithreaded-benchmarks)
38*dbb99499SAndroid Build Coastguard Worker
39*dbb99499SAndroid Build Coastguard Worker[CPU Timers](#cpu-timers)
40*dbb99499SAndroid Build Coastguard Worker
41*dbb99499SAndroid Build Coastguard Worker[Manual Timing](#manual-timing)
42*dbb99499SAndroid Build Coastguard Worker
43*dbb99499SAndroid Build Coastguard Worker[Setting the Time Unit](#setting-the-time-unit)
44*dbb99499SAndroid Build Coastguard Worker
45*dbb99499SAndroid Build Coastguard Worker[Random Interleaving](random_interleaving.md)
46*dbb99499SAndroid Build Coastguard Worker
47*dbb99499SAndroid Build Coastguard Worker[User-Requested Performance Counters](perf_counters.md)
48*dbb99499SAndroid Build Coastguard Worker
49*dbb99499SAndroid Build Coastguard Worker[Preventing Optimization](#preventing-optimization)
50*dbb99499SAndroid Build Coastguard Worker
51*dbb99499SAndroid Build Coastguard Worker[Reporting Statistics](#reporting-statistics)
52*dbb99499SAndroid Build Coastguard Worker
53*dbb99499SAndroid Build Coastguard Worker[Custom Statistics](#custom-statistics)
54*dbb99499SAndroid Build Coastguard Worker
55*dbb99499SAndroid Build Coastguard Worker[Memory Usage](#memory-usage)
56*dbb99499SAndroid Build Coastguard Worker
57*dbb99499SAndroid Build Coastguard Worker[Using RegisterBenchmark](#using-register-benchmark)
58*dbb99499SAndroid Build Coastguard Worker
59*dbb99499SAndroid Build Coastguard Worker[Exiting with an Error](#exiting-with-an-error)
60*dbb99499SAndroid Build Coastguard Worker
61*dbb99499SAndroid Build Coastguard Worker[A Faster `KeepRunning` Loop](#a-faster-keep-running-loop)
62*dbb99499SAndroid Build Coastguard Worker
63*dbb99499SAndroid Build Coastguard Worker## Benchmarking Tips
64*dbb99499SAndroid Build Coastguard Worker
65*dbb99499SAndroid Build Coastguard Worker[Disabling CPU Frequency Scaling](#disabling-cpu-frequency-scaling)
66*dbb99499SAndroid Build Coastguard Worker
67*dbb99499SAndroid Build Coastguard Worker[Reducing Variance in Benchmarks](reducing_variance.md)
68*dbb99499SAndroid Build Coastguard Worker
69*dbb99499SAndroid Build Coastguard Worker<a name="output-formats" />
70*dbb99499SAndroid Build Coastguard Worker
71*dbb99499SAndroid Build Coastguard Worker## Output Formats
72*dbb99499SAndroid Build Coastguard Worker
73*dbb99499SAndroid Build Coastguard WorkerThe library supports multiple output formats. Use the
74*dbb99499SAndroid Build Coastguard Worker`--benchmark_format=<console|json|csv>` flag (or set the
75*dbb99499SAndroid Build Coastguard Worker`BENCHMARK_FORMAT=<console|json|csv>` environment variable) to set
76*dbb99499SAndroid Build Coastguard Workerthe format type. `console` is the default format.
77*dbb99499SAndroid Build Coastguard Worker
78*dbb99499SAndroid Build Coastguard WorkerThe Console format is intended to be a human readable format. By default
79*dbb99499SAndroid Build Coastguard Workerthe format generates color output. Context is output on stderr and the
80*dbb99499SAndroid Build Coastguard Workertabular data on stdout. Example tabular output looks like:
81*dbb99499SAndroid Build Coastguard Worker
82*dbb99499SAndroid Build Coastguard Worker```
83*dbb99499SAndroid Build Coastguard WorkerBenchmark                               Time(ns)    CPU(ns) Iterations
84*dbb99499SAndroid Build Coastguard Worker----------------------------------------------------------------------
85*dbb99499SAndroid Build Coastguard WorkerBM_SetInsert/1024/1                        28928      29349      23853  133.097kB/s   33.2742k items/s
86*dbb99499SAndroid Build Coastguard WorkerBM_SetInsert/1024/8                        32065      32913      21375  949.487kB/s   237.372k items/s
87*dbb99499SAndroid Build Coastguard WorkerBM_SetInsert/1024/10                       33157      33648      21431  1.13369MB/s   290.225k items/s
88*dbb99499SAndroid Build Coastguard Worker```
89*dbb99499SAndroid Build Coastguard Worker
90*dbb99499SAndroid Build Coastguard WorkerThe JSON format outputs human readable json split into two top level attributes.
91*dbb99499SAndroid Build Coastguard WorkerThe `context` attribute contains information about the run in general, including
92*dbb99499SAndroid Build Coastguard Workerinformation about the CPU and the date.
93*dbb99499SAndroid Build Coastguard WorkerThe `benchmarks` attribute contains a list of every benchmark run. Example json
94*dbb99499SAndroid Build Coastguard Workeroutput looks like:
95*dbb99499SAndroid Build Coastguard Worker
96*dbb99499SAndroid Build Coastguard Worker```json
97*dbb99499SAndroid Build Coastguard Worker{
98*dbb99499SAndroid Build Coastguard Worker  "context": {
99*dbb99499SAndroid Build Coastguard Worker    "date": "2015/03/17-18:40:25",
100*dbb99499SAndroid Build Coastguard Worker    "num_cpus": 40,
101*dbb99499SAndroid Build Coastguard Worker    "mhz_per_cpu": 2801,
102*dbb99499SAndroid Build Coastguard Worker    "cpu_scaling_enabled": false,
103*dbb99499SAndroid Build Coastguard Worker    "build_type": "debug"
104*dbb99499SAndroid Build Coastguard Worker  },
105*dbb99499SAndroid Build Coastguard Worker  "benchmarks": [
106*dbb99499SAndroid Build Coastguard Worker    {
107*dbb99499SAndroid Build Coastguard Worker      "name": "BM_SetInsert/1024/1",
108*dbb99499SAndroid Build Coastguard Worker      "iterations": 94877,
109*dbb99499SAndroid Build Coastguard Worker      "real_time": 29275,
110*dbb99499SAndroid Build Coastguard Worker      "cpu_time": 29836,
111*dbb99499SAndroid Build Coastguard Worker      "bytes_per_second": 134066,
112*dbb99499SAndroid Build Coastguard Worker      "items_per_second": 33516
113*dbb99499SAndroid Build Coastguard Worker    },
114*dbb99499SAndroid Build Coastguard Worker    {
115*dbb99499SAndroid Build Coastguard Worker      "name": "BM_SetInsert/1024/8",
116*dbb99499SAndroid Build Coastguard Worker      "iterations": 21609,
117*dbb99499SAndroid Build Coastguard Worker      "real_time": 32317,
118*dbb99499SAndroid Build Coastguard Worker      "cpu_time": 32429,
119*dbb99499SAndroid Build Coastguard Worker      "bytes_per_second": 986770,
120*dbb99499SAndroid Build Coastguard Worker      "items_per_second": 246693
121*dbb99499SAndroid Build Coastguard Worker    },
122*dbb99499SAndroid Build Coastguard Worker    {
123*dbb99499SAndroid Build Coastguard Worker      "name": "BM_SetInsert/1024/10",
124*dbb99499SAndroid Build Coastguard Worker      "iterations": 21393,
125*dbb99499SAndroid Build Coastguard Worker      "real_time": 32724,
126*dbb99499SAndroid Build Coastguard Worker      "cpu_time": 33355,
127*dbb99499SAndroid Build Coastguard Worker      "bytes_per_second": 1199226,
128*dbb99499SAndroid Build Coastguard Worker      "items_per_second": 299807
129*dbb99499SAndroid Build Coastguard Worker    }
130*dbb99499SAndroid Build Coastguard Worker  ]
131*dbb99499SAndroid Build Coastguard Worker}
132*dbb99499SAndroid Build Coastguard Worker```
133*dbb99499SAndroid Build Coastguard Worker
134*dbb99499SAndroid Build Coastguard WorkerThe CSV format outputs comma-separated values. The `context` is output on stderr
135*dbb99499SAndroid Build Coastguard Workerand the CSV itself on stdout. Example CSV output looks like:
136*dbb99499SAndroid Build Coastguard Worker
137*dbb99499SAndroid Build Coastguard Worker```
138*dbb99499SAndroid Build Coastguard Workername,iterations,real_time,cpu_time,bytes_per_second,items_per_second,label
139*dbb99499SAndroid Build Coastguard Worker"BM_SetInsert/1024/1",65465,17890.7,8407.45,475768,118942,
140*dbb99499SAndroid Build Coastguard Worker"BM_SetInsert/1024/8",116606,18810.1,9766.64,3.27646e+06,819115,
141*dbb99499SAndroid Build Coastguard Worker"BM_SetInsert/1024/10",106365,17238.4,8421.53,4.74973e+06,1.18743e+06,
142*dbb99499SAndroid Build Coastguard Worker```
143*dbb99499SAndroid Build Coastguard Worker
144*dbb99499SAndroid Build Coastguard Worker<a name="output-files" />
145*dbb99499SAndroid Build Coastguard Worker
146*dbb99499SAndroid Build Coastguard Worker## Output Files
147*dbb99499SAndroid Build Coastguard Worker
148*dbb99499SAndroid Build Coastguard WorkerWrite benchmark results to a file with the `--benchmark_out=<filename>` option
149*dbb99499SAndroid Build Coastguard Worker(or set `BENCHMARK_OUT`). Specify the output format with
150*dbb99499SAndroid Build Coastguard Worker`--benchmark_out_format={json|console|csv}` (or set
151*dbb99499SAndroid Build Coastguard Worker`BENCHMARK_OUT_FORMAT={json|console|csv}`). Note that the 'csv' reporter is
152*dbb99499SAndroid Build Coastguard Workerdeprecated and the saved `.csv` file
153*dbb99499SAndroid Build Coastguard Worker[is not parsable](https://github.com/google/benchmark/issues/794) by csv
154*dbb99499SAndroid Build Coastguard Workerparsers.
155*dbb99499SAndroid Build Coastguard Worker
156*dbb99499SAndroid Build Coastguard WorkerSpecifying `--benchmark_out` does not suppress the console output.
157*dbb99499SAndroid Build Coastguard Worker
158*dbb99499SAndroid Build Coastguard Worker<a name="running-benchmarks" />
159*dbb99499SAndroid Build Coastguard Worker
160*dbb99499SAndroid Build Coastguard Worker## Running Benchmarks
161*dbb99499SAndroid Build Coastguard Worker
162*dbb99499SAndroid Build Coastguard WorkerBenchmarks are executed by running the produced binaries. Benchmarks binaries,
163*dbb99499SAndroid Build Coastguard Workerby default, accept options that may be specified either through their command
164*dbb99499SAndroid Build Coastguard Workerline interface or by setting environment variables before execution. For every
165*dbb99499SAndroid Build Coastguard Worker`--option_flag=<value>` CLI switch, a corresponding environment variable
166*dbb99499SAndroid Build Coastguard Worker`OPTION_FLAG=<value>` exist and is used as default if set (CLI switches always
167*dbb99499SAndroid Build Coastguard Worker prevails). A complete list of CLI options is available running benchmarks
168*dbb99499SAndroid Build Coastguard Worker with the `--help` switch.
169*dbb99499SAndroid Build Coastguard Worker
170*dbb99499SAndroid Build Coastguard Worker<a name="running-a-subset-of-benchmarks" />
171*dbb99499SAndroid Build Coastguard Worker
172*dbb99499SAndroid Build Coastguard Worker## Running a Subset of Benchmarks
173*dbb99499SAndroid Build Coastguard Worker
174*dbb99499SAndroid Build Coastguard WorkerThe `--benchmark_filter=<regex>` option (or `BENCHMARK_FILTER=<regex>`
175*dbb99499SAndroid Build Coastguard Workerenvironment variable) can be used to only run the benchmarks that match
176*dbb99499SAndroid Build Coastguard Workerthe specified `<regex>`. For example:
177*dbb99499SAndroid Build Coastguard Worker
178*dbb99499SAndroid Build Coastguard Worker```bash
179*dbb99499SAndroid Build Coastguard Worker$ ./run_benchmarks.x --benchmark_filter=BM_memcpy/32
180*dbb99499SAndroid Build Coastguard WorkerRun on (1 X 2300 MHz CPU )
181*dbb99499SAndroid Build Coastguard Worker2016-06-25 19:34:24
182*dbb99499SAndroid Build Coastguard WorkerBenchmark              Time           CPU Iterations
183*dbb99499SAndroid Build Coastguard Worker----------------------------------------------------
184*dbb99499SAndroid Build Coastguard WorkerBM_memcpy/32          11 ns         11 ns   79545455
185*dbb99499SAndroid Build Coastguard WorkerBM_memcpy/32k       2181 ns       2185 ns     324074
186*dbb99499SAndroid Build Coastguard WorkerBM_memcpy/32          12 ns         12 ns   54687500
187*dbb99499SAndroid Build Coastguard WorkerBM_memcpy/32k       1834 ns       1837 ns     357143
188*dbb99499SAndroid Build Coastguard Worker```
189*dbb99499SAndroid Build Coastguard Worker
190*dbb99499SAndroid Build Coastguard Worker## Disabling Benchmarks
191*dbb99499SAndroid Build Coastguard Worker
192*dbb99499SAndroid Build Coastguard WorkerIt is possible to temporarily disable benchmarks by renaming the benchmark
193*dbb99499SAndroid Build Coastguard Workerfunction to have the prefix "DISABLED_". This will cause the benchmark to
194*dbb99499SAndroid Build Coastguard Workerbe skipped at runtime.
195*dbb99499SAndroid Build Coastguard Worker
196*dbb99499SAndroid Build Coastguard Worker<a name="result-comparison" />
197*dbb99499SAndroid Build Coastguard Worker
198*dbb99499SAndroid Build Coastguard Worker## Result comparison
199*dbb99499SAndroid Build Coastguard Worker
200*dbb99499SAndroid Build Coastguard WorkerIt is possible to compare the benchmarking results.
201*dbb99499SAndroid Build Coastguard WorkerSee [Additional Tooling Documentation](tools.md)
202*dbb99499SAndroid Build Coastguard Worker
203*dbb99499SAndroid Build Coastguard Worker<a name="extra-context" />
204*dbb99499SAndroid Build Coastguard Worker
205*dbb99499SAndroid Build Coastguard Worker## Extra Context
206*dbb99499SAndroid Build Coastguard Worker
207*dbb99499SAndroid Build Coastguard WorkerSometimes it's useful to add extra context to the content printed before the
208*dbb99499SAndroid Build Coastguard Workerresults. By default this section includes information about the CPU on which
209*dbb99499SAndroid Build Coastguard Workerthe benchmarks are running. If you do want to add more context, you can use
210*dbb99499SAndroid Build Coastguard Workerthe `benchmark_context` command line flag:
211*dbb99499SAndroid Build Coastguard Worker
212*dbb99499SAndroid Build Coastguard Worker```bash
213*dbb99499SAndroid Build Coastguard Worker$ ./run_benchmarks --benchmark_context=pwd=`pwd`
214*dbb99499SAndroid Build Coastguard WorkerRun on (1 x 2300 MHz CPU)
215*dbb99499SAndroid Build Coastguard Workerpwd: /home/user/benchmark/
216*dbb99499SAndroid Build Coastguard WorkerBenchmark              Time           CPU Iterations
217*dbb99499SAndroid Build Coastguard Worker----------------------------------------------------
218*dbb99499SAndroid Build Coastguard WorkerBM_memcpy/32          11 ns         11 ns   79545455
219*dbb99499SAndroid Build Coastguard WorkerBM_memcpy/32k       2181 ns       2185 ns     324074
220*dbb99499SAndroid Build Coastguard Worker```
221*dbb99499SAndroid Build Coastguard Worker
222*dbb99499SAndroid Build Coastguard WorkerYou can get the same effect with the API:
223*dbb99499SAndroid Build Coastguard Worker
224*dbb99499SAndroid Build Coastguard Worker```c++
225*dbb99499SAndroid Build Coastguard Worker  benchmark::AddCustomContext("foo", "bar");
226*dbb99499SAndroid Build Coastguard Worker```
227*dbb99499SAndroid Build Coastguard Worker
228*dbb99499SAndroid Build Coastguard WorkerNote that attempts to add a second value with the same key will fail with an
229*dbb99499SAndroid Build Coastguard Workererror message.
230*dbb99499SAndroid Build Coastguard Worker
231*dbb99499SAndroid Build Coastguard Worker<a name="runtime-and-reporting-considerations" />
232*dbb99499SAndroid Build Coastguard Worker
233*dbb99499SAndroid Build Coastguard Worker## Runtime and Reporting Considerations
234*dbb99499SAndroid Build Coastguard Worker
235*dbb99499SAndroid Build Coastguard WorkerWhen the benchmark binary is executed, each benchmark function is run serially.
236*dbb99499SAndroid Build Coastguard WorkerThe number of iterations to run is determined dynamically by running the
237*dbb99499SAndroid Build Coastguard Workerbenchmark a few times and measuring the time taken and ensuring that the
238*dbb99499SAndroid Build Coastguard Workerultimate result will be statistically stable. As such, faster benchmark
239*dbb99499SAndroid Build Coastguard Workerfunctions will be run for more iterations than slower benchmark functions, and
240*dbb99499SAndroid Build Coastguard Workerthe number of iterations is thus reported.
241*dbb99499SAndroid Build Coastguard Worker
242*dbb99499SAndroid Build Coastguard WorkerIn all cases, the number of iterations for which the benchmark is run is
243*dbb99499SAndroid Build Coastguard Workergoverned by the amount of time the benchmark takes. Concretely, the number of
244*dbb99499SAndroid Build Coastguard Workeriterations is at least one, not more than 1e9, until CPU time is greater than
245*dbb99499SAndroid Build Coastguard Workerthe minimum time, or the wallclock time is 5x minimum time. The minimum time is
246*dbb99499SAndroid Build Coastguard Workerset per benchmark by calling `MinTime` on the registered benchmark object.
247*dbb99499SAndroid Build Coastguard Worker
248*dbb99499SAndroid Build Coastguard WorkerFurthermore warming up a benchmark might be necessary in order to get
249*dbb99499SAndroid Build Coastguard Workerstable results because of e.g caching effects of the code under benchmark.
250*dbb99499SAndroid Build Coastguard WorkerWarming up means running the benchmark a given amount of time, before
251*dbb99499SAndroid Build Coastguard Workerresults are actually taken into account. The amount of time for which
252*dbb99499SAndroid Build Coastguard Workerthe warmup should be run can be set per benchmark by calling
253*dbb99499SAndroid Build Coastguard Worker`MinWarmUpTime` on the registered benchmark object or for all benchmarks
254*dbb99499SAndroid Build Coastguard Workerusing the `--benchmark_min_warmup_time` command-line option. Note that
255*dbb99499SAndroid Build Coastguard Worker`MinWarmUpTime` will overwrite the value of `--benchmark_min_warmup_time`
256*dbb99499SAndroid Build Coastguard Workerfor the single benchmark. How many iterations the warmup run of each
257*dbb99499SAndroid Build Coastguard Workerbenchmark takes is determined the same way as described in the paragraph
258*dbb99499SAndroid Build Coastguard Workerabove. Per default the warmup phase is set to 0 seconds and is therefore
259*dbb99499SAndroid Build Coastguard Workerdisabled.
260*dbb99499SAndroid Build Coastguard Worker
261*dbb99499SAndroid Build Coastguard WorkerAverage timings are then reported over the iterations run. If multiple
262*dbb99499SAndroid Build Coastguard Workerrepetitions are requested using the `--benchmark_repetitions` command-line
263*dbb99499SAndroid Build Coastguard Workeroption, or at registration time, the benchmark function will be run several
264*dbb99499SAndroid Build Coastguard Workertimes and statistical results across these repetitions will also be reported.
265*dbb99499SAndroid Build Coastguard Worker
266*dbb99499SAndroid Build Coastguard WorkerAs well as the per-benchmark entries, a preamble in the report will include
267*dbb99499SAndroid Build Coastguard Workerinformation about the machine on which the benchmarks are run.
268*dbb99499SAndroid Build Coastguard Worker
269*dbb99499SAndroid Build Coastguard Worker<a name="setup-teardown" />
270*dbb99499SAndroid Build Coastguard Worker
271*dbb99499SAndroid Build Coastguard Worker## Setup/Teardown
272*dbb99499SAndroid Build Coastguard Worker
273*dbb99499SAndroid Build Coastguard WorkerGlobal setup/teardown specific to each benchmark can be done by
274*dbb99499SAndroid Build Coastguard Workerpassing a callback to Setup/Teardown:
275*dbb99499SAndroid Build Coastguard Worker
276*dbb99499SAndroid Build Coastguard WorkerThe setup/teardown callbacks will be invoked once for each benchmark. If the
277*dbb99499SAndroid Build Coastguard Workerbenchmark is multi-threaded (will run in k threads), they will be invoked
278*dbb99499SAndroid Build Coastguard Workerexactly once before each run with k threads.
279*dbb99499SAndroid Build Coastguard Worker
280*dbb99499SAndroid Build Coastguard WorkerIf the benchmark uses different size groups of threads, the above will be true
281*dbb99499SAndroid Build Coastguard Workerfor each size group.
282*dbb99499SAndroid Build Coastguard Worker
283*dbb99499SAndroid Build Coastguard WorkerEg.,
284*dbb99499SAndroid Build Coastguard Worker
285*dbb99499SAndroid Build Coastguard Worker```c++
286*dbb99499SAndroid Build Coastguard Workerstatic void DoSetup(const benchmark::State& state) {
287*dbb99499SAndroid Build Coastguard Worker}
288*dbb99499SAndroid Build Coastguard Worker
289*dbb99499SAndroid Build Coastguard Workerstatic void DoTeardown(const benchmark::State& state) {
290*dbb99499SAndroid Build Coastguard Worker}
291*dbb99499SAndroid Build Coastguard Worker
292*dbb99499SAndroid Build Coastguard Workerstatic void BM_func(benchmark::State& state) {...}
293*dbb99499SAndroid Build Coastguard Worker
294*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_func)->Arg(1)->Arg(3)->Threads(16)->Threads(32)->Setup(DoSetup)->Teardown(DoTeardown);
295*dbb99499SAndroid Build Coastguard Worker
296*dbb99499SAndroid Build Coastguard Worker```
297*dbb99499SAndroid Build Coastguard Worker
298*dbb99499SAndroid Build Coastguard WorkerIn this example, `DoSetup` and `DoTearDown` will be invoked 4 times each,
299*dbb99499SAndroid Build Coastguard Workerspecifically, once for each of this family:
300*dbb99499SAndroid Build Coastguard Worker - BM_func_Arg_1_Threads_16, BM_func_Arg_1_Threads_32
301*dbb99499SAndroid Build Coastguard Worker - BM_func_Arg_3_Threads_16, BM_func_Arg_3_Threads_32
302*dbb99499SAndroid Build Coastguard Worker
303*dbb99499SAndroid Build Coastguard Worker<a name="passing-arguments" />
304*dbb99499SAndroid Build Coastguard Worker
305*dbb99499SAndroid Build Coastguard Worker## Passing Arguments
306*dbb99499SAndroid Build Coastguard Worker
307*dbb99499SAndroid Build Coastguard WorkerSometimes a family of benchmarks can be implemented with just one routine that
308*dbb99499SAndroid Build Coastguard Workertakes an extra argument to specify which one of the family of benchmarks to
309*dbb99499SAndroid Build Coastguard Workerrun. For example, the following code defines a family of benchmarks for
310*dbb99499SAndroid Build Coastguard Workermeasuring the speed of `memcpy()` calls of different lengths:
311*dbb99499SAndroid Build Coastguard Worker
312*dbb99499SAndroid Build Coastguard Worker```c++
313*dbb99499SAndroid Build Coastguard Workerstatic void BM_memcpy(benchmark::State& state) {
314*dbb99499SAndroid Build Coastguard Worker  char* src = new char[state.range(0)];
315*dbb99499SAndroid Build Coastguard Worker  char* dst = new char[state.range(0)];
316*dbb99499SAndroid Build Coastguard Worker  memset(src, 'x', state.range(0));
317*dbb99499SAndroid Build Coastguard Worker  for (auto _ : state)
318*dbb99499SAndroid Build Coastguard Worker    memcpy(dst, src, state.range(0));
319*dbb99499SAndroid Build Coastguard Worker  state.SetBytesProcessed(int64_t(state.iterations()) *
320*dbb99499SAndroid Build Coastguard Worker                          int64_t(state.range(0)));
321*dbb99499SAndroid Build Coastguard Worker  delete[] src;
322*dbb99499SAndroid Build Coastguard Worker  delete[] dst;
323*dbb99499SAndroid Build Coastguard Worker}
324*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_memcpy)->Arg(8)->Arg(64)->Arg(512)->Arg(4<<10)->Arg(8<<10);
325*dbb99499SAndroid Build Coastguard Worker```
326*dbb99499SAndroid Build Coastguard Worker
327*dbb99499SAndroid Build Coastguard WorkerThe preceding code is quite repetitive, and can be replaced with the following
328*dbb99499SAndroid Build Coastguard Workershort-hand. The following invocation will pick a few appropriate arguments in
329*dbb99499SAndroid Build Coastguard Workerthe specified range and will generate a benchmark for each such argument.
330*dbb99499SAndroid Build Coastguard Worker
331*dbb99499SAndroid Build Coastguard Worker```c++
332*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_memcpy)->Range(8, 8<<10);
333*dbb99499SAndroid Build Coastguard Worker```
334*dbb99499SAndroid Build Coastguard Worker
335*dbb99499SAndroid Build Coastguard WorkerBy default the arguments in the range are generated in multiples of eight and
336*dbb99499SAndroid Build Coastguard Workerthe command above selects [ 8, 64, 512, 4k, 8k ]. In the following code the
337*dbb99499SAndroid Build Coastguard Workerrange multiplier is changed to multiples of two.
338*dbb99499SAndroid Build Coastguard Worker
339*dbb99499SAndroid Build Coastguard Worker```c++
340*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_memcpy)->RangeMultiplier(2)->Range(8, 8<<10);
341*dbb99499SAndroid Build Coastguard Worker```
342*dbb99499SAndroid Build Coastguard Worker
343*dbb99499SAndroid Build Coastguard WorkerNow arguments generated are [ 8, 16, 32, 64, 128, 256, 512, 1024, 2k, 4k, 8k ].
344*dbb99499SAndroid Build Coastguard Worker
345*dbb99499SAndroid Build Coastguard WorkerThe preceding code shows a method of defining a sparse range.  The following
346*dbb99499SAndroid Build Coastguard Workerexample shows a method of defining a dense range. It is then used to benchmark
347*dbb99499SAndroid Build Coastguard Workerthe performance of `std::vector` initialization for uniformly increasing sizes.
348*dbb99499SAndroid Build Coastguard Worker
349*dbb99499SAndroid Build Coastguard Worker```c++
350*dbb99499SAndroid Build Coastguard Workerstatic void BM_DenseRange(benchmark::State& state) {
351*dbb99499SAndroid Build Coastguard Worker  for(auto _ : state) {
352*dbb99499SAndroid Build Coastguard Worker    std::vector<int> v(state.range(0), state.range(0));
353*dbb99499SAndroid Build Coastguard Worker    auto data = v.data();
354*dbb99499SAndroid Build Coastguard Worker    benchmark::DoNotOptimize(data);
355*dbb99499SAndroid Build Coastguard Worker    benchmark::ClobberMemory();
356*dbb99499SAndroid Build Coastguard Worker  }
357*dbb99499SAndroid Build Coastguard Worker}
358*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_DenseRange)->DenseRange(0, 1024, 128);
359*dbb99499SAndroid Build Coastguard Worker```
360*dbb99499SAndroid Build Coastguard Worker
361*dbb99499SAndroid Build Coastguard WorkerNow arguments generated are [ 0, 128, 256, 384, 512, 640, 768, 896, 1024 ].
362*dbb99499SAndroid Build Coastguard Worker
363*dbb99499SAndroid Build Coastguard WorkerYou might have a benchmark that depends on two or more inputs. For example, the
364*dbb99499SAndroid Build Coastguard Workerfollowing code defines a family of benchmarks for measuring the speed of set
365*dbb99499SAndroid Build Coastguard Workerinsertion.
366*dbb99499SAndroid Build Coastguard Worker
367*dbb99499SAndroid Build Coastguard Worker```c++
368*dbb99499SAndroid Build Coastguard Workerstatic void BM_SetInsert(benchmark::State& state) {
369*dbb99499SAndroid Build Coastguard Worker  std::set<int> data;
370*dbb99499SAndroid Build Coastguard Worker  for (auto _ : state) {
371*dbb99499SAndroid Build Coastguard Worker    state.PauseTiming();
372*dbb99499SAndroid Build Coastguard Worker    data = ConstructRandomSet(state.range(0));
373*dbb99499SAndroid Build Coastguard Worker    state.ResumeTiming();
374*dbb99499SAndroid Build Coastguard Worker    for (int j = 0; j < state.range(1); ++j)
375*dbb99499SAndroid Build Coastguard Worker      data.insert(RandomNumber());
376*dbb99499SAndroid Build Coastguard Worker  }
377*dbb99499SAndroid Build Coastguard Worker}
378*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_SetInsert)
379*dbb99499SAndroid Build Coastguard Worker    ->Args({1<<10, 128})
380*dbb99499SAndroid Build Coastguard Worker    ->Args({2<<10, 128})
381*dbb99499SAndroid Build Coastguard Worker    ->Args({4<<10, 128})
382*dbb99499SAndroid Build Coastguard Worker    ->Args({8<<10, 128})
383*dbb99499SAndroid Build Coastguard Worker    ->Args({1<<10, 512})
384*dbb99499SAndroid Build Coastguard Worker    ->Args({2<<10, 512})
385*dbb99499SAndroid Build Coastguard Worker    ->Args({4<<10, 512})
386*dbb99499SAndroid Build Coastguard Worker    ->Args({8<<10, 512});
387*dbb99499SAndroid Build Coastguard Worker```
388*dbb99499SAndroid Build Coastguard Worker
389*dbb99499SAndroid Build Coastguard WorkerThe preceding code is quite repetitive, and can be replaced with the following
390*dbb99499SAndroid Build Coastguard Workershort-hand. The following macro will pick a few appropriate arguments in the
391*dbb99499SAndroid Build Coastguard Workerproduct of the two specified ranges and will generate a benchmark for each such
392*dbb99499SAndroid Build Coastguard Workerpair.
393*dbb99499SAndroid Build Coastguard Worker
394*dbb99499SAndroid Build Coastguard Worker<!-- {% raw %} -->
395*dbb99499SAndroid Build Coastguard Worker```c++
396*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_SetInsert)->Ranges({{1<<10, 8<<10}, {128, 512}});
397*dbb99499SAndroid Build Coastguard Worker```
398*dbb99499SAndroid Build Coastguard Worker<!-- {% endraw %} -->
399*dbb99499SAndroid Build Coastguard Worker
400*dbb99499SAndroid Build Coastguard WorkerSome benchmarks may require specific argument values that cannot be expressed
401*dbb99499SAndroid Build Coastguard Workerwith `Ranges`. In this case, `ArgsProduct` offers the ability to generate a
402*dbb99499SAndroid Build Coastguard Workerbenchmark input for each combination in the product of the supplied vectors.
403*dbb99499SAndroid Build Coastguard Worker
404*dbb99499SAndroid Build Coastguard Worker<!-- {% raw %} -->
405*dbb99499SAndroid Build Coastguard Worker```c++
406*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_SetInsert)
407*dbb99499SAndroid Build Coastguard Worker    ->ArgsProduct({{1<<10, 3<<10, 8<<10}, {20, 40, 60, 80}})
408*dbb99499SAndroid Build Coastguard Worker// would generate the same benchmark arguments as
409*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_SetInsert)
410*dbb99499SAndroid Build Coastguard Worker    ->Args({1<<10, 20})
411*dbb99499SAndroid Build Coastguard Worker    ->Args({3<<10, 20})
412*dbb99499SAndroid Build Coastguard Worker    ->Args({8<<10, 20})
413*dbb99499SAndroid Build Coastguard Worker    ->Args({3<<10, 40})
414*dbb99499SAndroid Build Coastguard Worker    ->Args({8<<10, 40})
415*dbb99499SAndroid Build Coastguard Worker    ->Args({1<<10, 40})
416*dbb99499SAndroid Build Coastguard Worker    ->Args({1<<10, 60})
417*dbb99499SAndroid Build Coastguard Worker    ->Args({3<<10, 60})
418*dbb99499SAndroid Build Coastguard Worker    ->Args({8<<10, 60})
419*dbb99499SAndroid Build Coastguard Worker    ->Args({1<<10, 80})
420*dbb99499SAndroid Build Coastguard Worker    ->Args({3<<10, 80})
421*dbb99499SAndroid Build Coastguard Worker    ->Args({8<<10, 80});
422*dbb99499SAndroid Build Coastguard Worker```
423*dbb99499SAndroid Build Coastguard Worker<!-- {% endraw %} -->
424*dbb99499SAndroid Build Coastguard Worker
425*dbb99499SAndroid Build Coastguard WorkerFor the most common scenarios, helper methods for creating a list of
426*dbb99499SAndroid Build Coastguard Workerintegers for a given sparse or dense range are provided.
427*dbb99499SAndroid Build Coastguard Worker
428*dbb99499SAndroid Build Coastguard Worker```c++
429*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_SetInsert)
430*dbb99499SAndroid Build Coastguard Worker    ->ArgsProduct({
431*dbb99499SAndroid Build Coastguard Worker      benchmark::CreateRange(8, 128, /*multi=*/2),
432*dbb99499SAndroid Build Coastguard Worker      benchmark::CreateDenseRange(1, 4, /*step=*/1)
433*dbb99499SAndroid Build Coastguard Worker    })
434*dbb99499SAndroid Build Coastguard Worker// would generate the same benchmark arguments as
435*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_SetInsert)
436*dbb99499SAndroid Build Coastguard Worker    ->ArgsProduct({
437*dbb99499SAndroid Build Coastguard Worker      {8, 16, 32, 64, 128},
438*dbb99499SAndroid Build Coastguard Worker      {1, 2, 3, 4}
439*dbb99499SAndroid Build Coastguard Worker    });
440*dbb99499SAndroid Build Coastguard Worker```
441*dbb99499SAndroid Build Coastguard Worker
442*dbb99499SAndroid Build Coastguard WorkerFor more complex patterns of inputs, passing a custom function to `Apply` allows
443*dbb99499SAndroid Build Coastguard Workerprogrammatic specification of an arbitrary set of arguments on which to run the
444*dbb99499SAndroid Build Coastguard Workerbenchmark. The following example enumerates a dense range on one parameter,
445*dbb99499SAndroid Build Coastguard Workerand a sparse range on the second.
446*dbb99499SAndroid Build Coastguard Worker
447*dbb99499SAndroid Build Coastguard Worker```c++
448*dbb99499SAndroid Build Coastguard Workerstatic void CustomArguments(benchmark::internal::Benchmark* b) {
449*dbb99499SAndroid Build Coastguard Worker  for (int i = 0; i <= 10; ++i)
450*dbb99499SAndroid Build Coastguard Worker    for (int j = 32; j <= 1024*1024; j *= 8)
451*dbb99499SAndroid Build Coastguard Worker      b->Args({i, j});
452*dbb99499SAndroid Build Coastguard Worker}
453*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_SetInsert)->Apply(CustomArguments);
454*dbb99499SAndroid Build Coastguard Worker```
455*dbb99499SAndroid Build Coastguard Worker
456*dbb99499SAndroid Build Coastguard Worker### Passing Arbitrary Arguments to a Benchmark
457*dbb99499SAndroid Build Coastguard Worker
458*dbb99499SAndroid Build Coastguard WorkerIn C++11 it is possible to define a benchmark that takes an arbitrary number
459*dbb99499SAndroid Build Coastguard Workerof extra arguments. The `BENCHMARK_CAPTURE(func, test_case_name, ...args)`
460*dbb99499SAndroid Build Coastguard Workermacro creates a benchmark that invokes `func`  with the `benchmark::State` as
461*dbb99499SAndroid Build Coastguard Workerthe first argument followed by the specified `args...`.
462*dbb99499SAndroid Build Coastguard WorkerThe `test_case_name` is appended to the name of the benchmark and
463*dbb99499SAndroid Build Coastguard Workershould describe the values passed.
464*dbb99499SAndroid Build Coastguard Worker
465*dbb99499SAndroid Build Coastguard Worker```c++
466*dbb99499SAndroid Build Coastguard Workertemplate <class ...Args>
467*dbb99499SAndroid Build Coastguard Workervoid BM_takes_args(benchmark::State& state, Args&&... args) {
468*dbb99499SAndroid Build Coastguard Worker  auto args_tuple = std::make_tuple(std::move(args)...);
469*dbb99499SAndroid Build Coastguard Worker  for (auto _ : state) {
470*dbb99499SAndroid Build Coastguard Worker    std::cout << std::get<0>(args_tuple) << ": " << std::get<1>(args_tuple)
471*dbb99499SAndroid Build Coastguard Worker              << '\n';
472*dbb99499SAndroid Build Coastguard Worker    [...]
473*dbb99499SAndroid Build Coastguard Worker  }
474*dbb99499SAndroid Build Coastguard Worker}
475*dbb99499SAndroid Build Coastguard Worker// Registers a benchmark named "BM_takes_args/int_string_test" that passes
476*dbb99499SAndroid Build Coastguard Worker// the specified values to `args`.
477*dbb99499SAndroid Build Coastguard WorkerBENCHMARK_CAPTURE(BM_takes_args, int_string_test, 42, std::string("abc"));
478*dbb99499SAndroid Build Coastguard Worker
479*dbb99499SAndroid Build Coastguard Worker// Registers the same benchmark "BM_takes_args/int_test" that passes
480*dbb99499SAndroid Build Coastguard Worker// the specified values to `args`.
481*dbb99499SAndroid Build Coastguard WorkerBENCHMARK_CAPTURE(BM_takes_args, int_test, 42, 43);
482*dbb99499SAndroid Build Coastguard Worker```
483*dbb99499SAndroid Build Coastguard Worker
484*dbb99499SAndroid Build Coastguard WorkerNote that elements of `...args` may refer to global variables. Users should
485*dbb99499SAndroid Build Coastguard Workeravoid modifying global state inside of a benchmark.
486*dbb99499SAndroid Build Coastguard Worker
487*dbb99499SAndroid Build Coastguard Worker<a name="asymptotic-complexity" />
488*dbb99499SAndroid Build Coastguard Worker
489*dbb99499SAndroid Build Coastguard Worker## Calculating Asymptotic Complexity (Big O)
490*dbb99499SAndroid Build Coastguard Worker
491*dbb99499SAndroid Build Coastguard WorkerAsymptotic complexity might be calculated for a family of benchmarks. The
492*dbb99499SAndroid Build Coastguard Workerfollowing code will calculate the coefficient for the high-order term in the
493*dbb99499SAndroid Build Coastguard Workerrunning time and the normalized root-mean square error of string comparison.
494*dbb99499SAndroid Build Coastguard Worker
495*dbb99499SAndroid Build Coastguard Worker```c++
496*dbb99499SAndroid Build Coastguard Workerstatic void BM_StringCompare(benchmark::State& state) {
497*dbb99499SAndroid Build Coastguard Worker  std::string s1(state.range(0), '-');
498*dbb99499SAndroid Build Coastguard Worker  std::string s2(state.range(0), '-');
499*dbb99499SAndroid Build Coastguard Worker  for (auto _ : state) {
500*dbb99499SAndroid Build Coastguard Worker    auto comparison_result = s1.compare(s2);
501*dbb99499SAndroid Build Coastguard Worker    benchmark::DoNotOptimize(comparison_result);
502*dbb99499SAndroid Build Coastguard Worker  }
503*dbb99499SAndroid Build Coastguard Worker  state.SetComplexityN(state.range(0));
504*dbb99499SAndroid Build Coastguard Worker}
505*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_StringCompare)
506*dbb99499SAndroid Build Coastguard Worker    ->RangeMultiplier(2)->Range(1<<10, 1<<18)->Complexity(benchmark::oN);
507*dbb99499SAndroid Build Coastguard Worker```
508*dbb99499SAndroid Build Coastguard Worker
509*dbb99499SAndroid Build Coastguard WorkerAs shown in the following invocation, asymptotic complexity might also be
510*dbb99499SAndroid Build Coastguard Workercalculated automatically.
511*dbb99499SAndroid Build Coastguard Worker
512*dbb99499SAndroid Build Coastguard Worker```c++
513*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_StringCompare)
514*dbb99499SAndroid Build Coastguard Worker    ->RangeMultiplier(2)->Range(1<<10, 1<<18)->Complexity();
515*dbb99499SAndroid Build Coastguard Worker```
516*dbb99499SAndroid Build Coastguard Worker
517*dbb99499SAndroid Build Coastguard WorkerThe following code will specify asymptotic complexity with a lambda function,
518*dbb99499SAndroid Build Coastguard Workerthat might be used to customize high-order term calculation.
519*dbb99499SAndroid Build Coastguard Worker
520*dbb99499SAndroid Build Coastguard Worker```c++
521*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_StringCompare)->RangeMultiplier(2)
522*dbb99499SAndroid Build Coastguard Worker    ->Range(1<<10, 1<<18)->Complexity([](benchmark::IterationCount n)->double{return n; });
523*dbb99499SAndroid Build Coastguard Worker```
524*dbb99499SAndroid Build Coastguard Worker
525*dbb99499SAndroid Build Coastguard Worker<a name="custom-benchmark-name" />
526*dbb99499SAndroid Build Coastguard Worker
527*dbb99499SAndroid Build Coastguard Worker## Custom Benchmark Name
528*dbb99499SAndroid Build Coastguard Worker
529*dbb99499SAndroid Build Coastguard WorkerYou can change the benchmark's name as follows:
530*dbb99499SAndroid Build Coastguard Worker
531*dbb99499SAndroid Build Coastguard Worker```c++
532*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_memcpy)->Name("memcpy")->RangeMultiplier(2)->Range(8, 8<<10);
533*dbb99499SAndroid Build Coastguard Worker```
534*dbb99499SAndroid Build Coastguard Worker
535*dbb99499SAndroid Build Coastguard WorkerThe invocation will execute the benchmark as before using `BM_memcpy` but changes
536*dbb99499SAndroid Build Coastguard Workerthe prefix in the report to `memcpy`.
537*dbb99499SAndroid Build Coastguard Worker
538*dbb99499SAndroid Build Coastguard Worker<a name="templated-benchmarks" />
539*dbb99499SAndroid Build Coastguard Worker
540*dbb99499SAndroid Build Coastguard Worker## Templated Benchmarks
541*dbb99499SAndroid Build Coastguard Worker
542*dbb99499SAndroid Build Coastguard WorkerThis example produces and consumes messages of size `sizeof(v)` `range_x`
543*dbb99499SAndroid Build Coastguard Workertimes. It also outputs throughput in the absence of multiprogramming.
544*dbb99499SAndroid Build Coastguard Worker
545*dbb99499SAndroid Build Coastguard Worker```c++
546*dbb99499SAndroid Build Coastguard Workertemplate <class Q> void BM_Sequential(benchmark::State& state) {
547*dbb99499SAndroid Build Coastguard Worker  Q q;
548*dbb99499SAndroid Build Coastguard Worker  typename Q::value_type v;
549*dbb99499SAndroid Build Coastguard Worker  for (auto _ : state) {
550*dbb99499SAndroid Build Coastguard Worker    for (int i = state.range(0); i--; )
551*dbb99499SAndroid Build Coastguard Worker      q.push(v);
552*dbb99499SAndroid Build Coastguard Worker    for (int e = state.range(0); e--; )
553*dbb99499SAndroid Build Coastguard Worker      q.Wait(&v);
554*dbb99499SAndroid Build Coastguard Worker  }
555*dbb99499SAndroid Build Coastguard Worker  // actually messages, not bytes:
556*dbb99499SAndroid Build Coastguard Worker  state.SetBytesProcessed(
557*dbb99499SAndroid Build Coastguard Worker      static_cast<int64_t>(state.iterations())*state.range(0));
558*dbb99499SAndroid Build Coastguard Worker}
559*dbb99499SAndroid Build Coastguard Worker// C++03
560*dbb99499SAndroid Build Coastguard WorkerBENCHMARK_TEMPLATE(BM_Sequential, WaitQueue<int>)->Range(1<<0, 1<<10);
561*dbb99499SAndroid Build Coastguard Worker
562*dbb99499SAndroid Build Coastguard Worker// C++11 or newer, you can use the BENCHMARK macro with template parameters:
563*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_Sequential<WaitQueue<int>>)->Range(1<<0, 1<<10);
564*dbb99499SAndroid Build Coastguard Worker
565*dbb99499SAndroid Build Coastguard Worker```
566*dbb99499SAndroid Build Coastguard Worker
567*dbb99499SAndroid Build Coastguard WorkerThree macros are provided for adding benchmark templates.
568*dbb99499SAndroid Build Coastguard Worker
569*dbb99499SAndroid Build Coastguard Worker```c++
570*dbb99499SAndroid Build Coastguard Worker#ifdef BENCHMARK_HAS_CXX11
571*dbb99499SAndroid Build Coastguard Worker#define BENCHMARK(func<...>) // Takes any number of parameters.
572*dbb99499SAndroid Build Coastguard Worker#else // C++ < C++11
573*dbb99499SAndroid Build Coastguard Worker#define BENCHMARK_TEMPLATE(func, arg1)
574*dbb99499SAndroid Build Coastguard Worker#endif
575*dbb99499SAndroid Build Coastguard Worker#define BENCHMARK_TEMPLATE1(func, arg1)
576*dbb99499SAndroid Build Coastguard Worker#define BENCHMARK_TEMPLATE2(func, arg1, arg2)
577*dbb99499SAndroid Build Coastguard Worker```
578*dbb99499SAndroid Build Coastguard Worker
579*dbb99499SAndroid Build Coastguard Worker<a name="templated-benchmarks-with-arguments" />
580*dbb99499SAndroid Build Coastguard Worker
581*dbb99499SAndroid Build Coastguard Worker## Templated Benchmarks that take arguments
582*dbb99499SAndroid Build Coastguard Worker
583*dbb99499SAndroid Build Coastguard WorkerSometimes there is a need to template benchmarks, and provide arguments to them.
584*dbb99499SAndroid Build Coastguard Worker
585*dbb99499SAndroid Build Coastguard Worker```c++
586*dbb99499SAndroid Build Coastguard Workertemplate <class Q> void BM_Sequential_With_Step(benchmark::State& state, int step) {
587*dbb99499SAndroid Build Coastguard Worker  Q q;
588*dbb99499SAndroid Build Coastguard Worker  typename Q::value_type v;
589*dbb99499SAndroid Build Coastguard Worker  for (auto _ : state) {
590*dbb99499SAndroid Build Coastguard Worker    for (int i = state.range(0); i-=step; )
591*dbb99499SAndroid Build Coastguard Worker      q.push(v);
592*dbb99499SAndroid Build Coastguard Worker    for (int e = state.range(0); e-=step; )
593*dbb99499SAndroid Build Coastguard Worker      q.Wait(&v);
594*dbb99499SAndroid Build Coastguard Worker  }
595*dbb99499SAndroid Build Coastguard Worker  // actually messages, not bytes:
596*dbb99499SAndroid Build Coastguard Worker  state.SetBytesProcessed(
597*dbb99499SAndroid Build Coastguard Worker      static_cast<int64_t>(state.iterations())*state.range(0));
598*dbb99499SAndroid Build Coastguard Worker}
599*dbb99499SAndroid Build Coastguard Worker
600*dbb99499SAndroid Build Coastguard WorkerBENCHMARK_TEMPLATE1_CAPTURE(BM_Sequential, WaitQueue<int>, Step1, 1)->Range(1<<0, 1<<10);
601*dbb99499SAndroid Build Coastguard Worker```
602*dbb99499SAndroid Build Coastguard Worker
603*dbb99499SAndroid Build Coastguard Worker<a name="fixtures" />
604*dbb99499SAndroid Build Coastguard Worker
605*dbb99499SAndroid Build Coastguard Worker## Fixtures
606*dbb99499SAndroid Build Coastguard Worker
607*dbb99499SAndroid Build Coastguard WorkerFixture tests are created by first defining a type that derives from
608*dbb99499SAndroid Build Coastguard Worker`::benchmark::Fixture` and then creating/registering the tests using the
609*dbb99499SAndroid Build Coastguard Workerfollowing macros:
610*dbb99499SAndroid Build Coastguard Worker
611*dbb99499SAndroid Build Coastguard Worker* `BENCHMARK_F(ClassName, Method)`
612*dbb99499SAndroid Build Coastguard Worker* `BENCHMARK_DEFINE_F(ClassName, Method)`
613*dbb99499SAndroid Build Coastguard Worker* `BENCHMARK_REGISTER_F(ClassName, Method)`
614*dbb99499SAndroid Build Coastguard Worker
615*dbb99499SAndroid Build Coastguard WorkerFor Example:
616*dbb99499SAndroid Build Coastguard Worker
617*dbb99499SAndroid Build Coastguard Worker```c++
618*dbb99499SAndroid Build Coastguard Workerclass MyFixture : public benchmark::Fixture {
619*dbb99499SAndroid Build Coastguard Workerpublic:
620*dbb99499SAndroid Build Coastguard Worker  void SetUp(::benchmark::State& state) {
621*dbb99499SAndroid Build Coastguard Worker  }
622*dbb99499SAndroid Build Coastguard Worker
623*dbb99499SAndroid Build Coastguard Worker  void TearDown(::benchmark::State& state) {
624*dbb99499SAndroid Build Coastguard Worker  }
625*dbb99499SAndroid Build Coastguard Worker};
626*dbb99499SAndroid Build Coastguard Worker
627*dbb99499SAndroid Build Coastguard Worker// Defines and registers `FooTest` using the class `MyFixture`.
628*dbb99499SAndroid Build Coastguard WorkerBENCHMARK_F(MyFixture, FooTest)(benchmark::State& st) {
629*dbb99499SAndroid Build Coastguard Worker   for (auto _ : st) {
630*dbb99499SAndroid Build Coastguard Worker     ...
631*dbb99499SAndroid Build Coastguard Worker  }
632*dbb99499SAndroid Build Coastguard Worker}
633*dbb99499SAndroid Build Coastguard Worker
634*dbb99499SAndroid Build Coastguard Worker// Only defines `BarTest` using the class `MyFixture`.
635*dbb99499SAndroid Build Coastguard WorkerBENCHMARK_DEFINE_F(MyFixture, BarTest)(benchmark::State& st) {
636*dbb99499SAndroid Build Coastguard Worker   for (auto _ : st) {
637*dbb99499SAndroid Build Coastguard Worker     ...
638*dbb99499SAndroid Build Coastguard Worker  }
639*dbb99499SAndroid Build Coastguard Worker}
640*dbb99499SAndroid Build Coastguard Worker// `BarTest` is NOT registered.
641*dbb99499SAndroid Build Coastguard WorkerBENCHMARK_REGISTER_F(MyFixture, BarTest)->Threads(2);
642*dbb99499SAndroid Build Coastguard Worker// `BarTest` is now registered.
643*dbb99499SAndroid Build Coastguard Worker```
644*dbb99499SAndroid Build Coastguard Worker
645*dbb99499SAndroid Build Coastguard Worker### Templated Fixtures
646*dbb99499SAndroid Build Coastguard Worker
647*dbb99499SAndroid Build Coastguard WorkerAlso you can create templated fixture by using the following macros:
648*dbb99499SAndroid Build Coastguard Worker
649*dbb99499SAndroid Build Coastguard Worker* `BENCHMARK_TEMPLATE_F(ClassName, Method, ...)`
650*dbb99499SAndroid Build Coastguard Worker* `BENCHMARK_TEMPLATE_DEFINE_F(ClassName, Method, ...)`
651*dbb99499SAndroid Build Coastguard Worker
652*dbb99499SAndroid Build Coastguard WorkerFor example:
653*dbb99499SAndroid Build Coastguard Worker
654*dbb99499SAndroid Build Coastguard Worker```c++
655*dbb99499SAndroid Build Coastguard Workertemplate<typename T>
656*dbb99499SAndroid Build Coastguard Workerclass MyFixture : public benchmark::Fixture {};
657*dbb99499SAndroid Build Coastguard Worker
658*dbb99499SAndroid Build Coastguard Worker// Defines and registers `IntTest` using the class template `MyFixture<int>`.
659*dbb99499SAndroid Build Coastguard WorkerBENCHMARK_TEMPLATE_F(MyFixture, IntTest, int)(benchmark::State& st) {
660*dbb99499SAndroid Build Coastguard Worker   for (auto _ : st) {
661*dbb99499SAndroid Build Coastguard Worker     ...
662*dbb99499SAndroid Build Coastguard Worker  }
663*dbb99499SAndroid Build Coastguard Worker}
664*dbb99499SAndroid Build Coastguard Worker
665*dbb99499SAndroid Build Coastguard Worker// Only defines `DoubleTest` using the class template `MyFixture<double>`.
666*dbb99499SAndroid Build Coastguard WorkerBENCHMARK_TEMPLATE_DEFINE_F(MyFixture, DoubleTest, double)(benchmark::State& st) {
667*dbb99499SAndroid Build Coastguard Worker   for (auto _ : st) {
668*dbb99499SAndroid Build Coastguard Worker     ...
669*dbb99499SAndroid Build Coastguard Worker  }
670*dbb99499SAndroid Build Coastguard Worker}
671*dbb99499SAndroid Build Coastguard Worker// `DoubleTest` is NOT registered.
672*dbb99499SAndroid Build Coastguard WorkerBENCHMARK_REGISTER_F(MyFixture, DoubleTest)->Threads(2);
673*dbb99499SAndroid Build Coastguard Worker// `DoubleTest` is now registered.
674*dbb99499SAndroid Build Coastguard Worker```
675*dbb99499SAndroid Build Coastguard Worker
676*dbb99499SAndroid Build Coastguard Worker<a name="custom-counters" />
677*dbb99499SAndroid Build Coastguard Worker
678*dbb99499SAndroid Build Coastguard Worker## Custom Counters
679*dbb99499SAndroid Build Coastguard Worker
680*dbb99499SAndroid Build Coastguard WorkerYou can add your own counters with user-defined names. The example below
681*dbb99499SAndroid Build Coastguard Workerwill add columns "Foo", "Bar" and "Baz" in its output:
682*dbb99499SAndroid Build Coastguard Worker
683*dbb99499SAndroid Build Coastguard Worker```c++
684*dbb99499SAndroid Build Coastguard Workerstatic void UserCountersExample1(benchmark::State& state) {
685*dbb99499SAndroid Build Coastguard Worker  double numFoos = 0, numBars = 0, numBazs = 0;
686*dbb99499SAndroid Build Coastguard Worker  for (auto _ : state) {
687*dbb99499SAndroid Build Coastguard Worker    // ... count Foo,Bar,Baz events
688*dbb99499SAndroid Build Coastguard Worker  }
689*dbb99499SAndroid Build Coastguard Worker  state.counters["Foo"] = numFoos;
690*dbb99499SAndroid Build Coastguard Worker  state.counters["Bar"] = numBars;
691*dbb99499SAndroid Build Coastguard Worker  state.counters["Baz"] = numBazs;
692*dbb99499SAndroid Build Coastguard Worker}
693*dbb99499SAndroid Build Coastguard Worker```
694*dbb99499SAndroid Build Coastguard Worker
695*dbb99499SAndroid Build Coastguard WorkerThe `state.counters` object is a `std::map` with `std::string` keys
696*dbb99499SAndroid Build Coastguard Workerand `Counter` values. The latter is a `double`-like class, via an implicit
697*dbb99499SAndroid Build Coastguard Workerconversion to `double&`. Thus you can use all of the standard arithmetic
698*dbb99499SAndroid Build Coastguard Workerassignment operators (`=,+=,-=,*=,/=`) to change the value of each counter.
699*dbb99499SAndroid Build Coastguard Worker
700*dbb99499SAndroid Build Coastguard WorkerIn multithreaded benchmarks, each counter is set on the calling thread only.
701*dbb99499SAndroid Build Coastguard WorkerWhen the benchmark finishes, the counters from each thread will be summed;
702*dbb99499SAndroid Build Coastguard Workerthe resulting sum is the value which will be shown for the benchmark.
703*dbb99499SAndroid Build Coastguard Worker
704*dbb99499SAndroid Build Coastguard WorkerThe `Counter` constructor accepts three parameters: the value as a `double`
705*dbb99499SAndroid Build Coastguard Worker; a bit flag which allows you to show counters as rates, and/or as per-thread
706*dbb99499SAndroid Build Coastguard Workeriteration, and/or as per-thread averages, and/or iteration invariants,
707*dbb99499SAndroid Build Coastguard Workerand/or finally inverting the result; and a flag specifying the 'unit' - i.e.
708*dbb99499SAndroid Build Coastguard Workeris 1k a 1000 (default, `benchmark::Counter::OneK::kIs1000`), or 1024
709*dbb99499SAndroid Build Coastguard Worker(`benchmark::Counter::OneK::kIs1024`)?
710*dbb99499SAndroid Build Coastguard Worker
711*dbb99499SAndroid Build Coastguard Worker```c++
712*dbb99499SAndroid Build Coastguard Worker  // sets a simple counter
713*dbb99499SAndroid Build Coastguard Worker  state.counters["Foo"] = numFoos;
714*dbb99499SAndroid Build Coastguard Worker
715*dbb99499SAndroid Build Coastguard Worker  // Set the counter as a rate. It will be presented divided
716*dbb99499SAndroid Build Coastguard Worker  // by the duration of the benchmark.
717*dbb99499SAndroid Build Coastguard Worker  // Meaning: per one second, how many 'foo's are processed?
718*dbb99499SAndroid Build Coastguard Worker  state.counters["FooRate"] = Counter(numFoos, benchmark::Counter::kIsRate);
719*dbb99499SAndroid Build Coastguard Worker
720*dbb99499SAndroid Build Coastguard Worker  // Set the counter as a rate. It will be presented divided
721*dbb99499SAndroid Build Coastguard Worker  // by the duration of the benchmark, and the result inverted.
722*dbb99499SAndroid Build Coastguard Worker  // Meaning: how many seconds it takes to process one 'foo'?
723*dbb99499SAndroid Build Coastguard Worker  state.counters["FooInvRate"] = Counter(numFoos, benchmark::Counter::kIsRate | benchmark::Counter::kInvert);
724*dbb99499SAndroid Build Coastguard Worker
725*dbb99499SAndroid Build Coastguard Worker  // Set the counter as a thread-average quantity. It will
726*dbb99499SAndroid Build Coastguard Worker  // be presented divided by the number of threads.
727*dbb99499SAndroid Build Coastguard Worker  state.counters["FooAvg"] = Counter(numFoos, benchmark::Counter::kAvgThreads);
728*dbb99499SAndroid Build Coastguard Worker
729*dbb99499SAndroid Build Coastguard Worker  // There's also a combined flag:
730*dbb99499SAndroid Build Coastguard Worker  state.counters["FooAvgRate"] = Counter(numFoos,benchmark::Counter::kAvgThreadsRate);
731*dbb99499SAndroid Build Coastguard Worker
732*dbb99499SAndroid Build Coastguard Worker  // This says that we process with the rate of state.range(0) bytes every iteration:
733*dbb99499SAndroid Build Coastguard Worker  state.counters["BytesProcessed"] = Counter(state.range(0), benchmark::Counter::kIsIterationInvariantRate, benchmark::Counter::OneK::kIs1024);
734*dbb99499SAndroid Build Coastguard Worker```
735*dbb99499SAndroid Build Coastguard Worker
736*dbb99499SAndroid Build Coastguard WorkerWhen you're compiling in C++11 mode or later you can use `insert()` with
737*dbb99499SAndroid Build Coastguard Worker`std::initializer_list`:
738*dbb99499SAndroid Build Coastguard Worker
739*dbb99499SAndroid Build Coastguard Worker<!-- {% raw %} -->
740*dbb99499SAndroid Build Coastguard Worker```c++
741*dbb99499SAndroid Build Coastguard Worker  // With C++11, this can be done:
742*dbb99499SAndroid Build Coastguard Worker  state.counters.insert({{"Foo", numFoos}, {"Bar", numBars}, {"Baz", numBazs}});
743*dbb99499SAndroid Build Coastguard Worker  // ... instead of:
744*dbb99499SAndroid Build Coastguard Worker  state.counters["Foo"] = numFoos;
745*dbb99499SAndroid Build Coastguard Worker  state.counters["Bar"] = numBars;
746*dbb99499SAndroid Build Coastguard Worker  state.counters["Baz"] = numBazs;
747*dbb99499SAndroid Build Coastguard Worker```
748*dbb99499SAndroid Build Coastguard Worker<!-- {% endraw %} -->
749*dbb99499SAndroid Build Coastguard Worker
750*dbb99499SAndroid Build Coastguard Worker### Counter Reporting
751*dbb99499SAndroid Build Coastguard Worker
752*dbb99499SAndroid Build Coastguard WorkerWhen using the console reporter, by default, user counters are printed at
753*dbb99499SAndroid Build Coastguard Workerthe end after the table, the same way as ``bytes_processed`` and
754*dbb99499SAndroid Build Coastguard Worker``items_processed``. This is best for cases in which there are few counters,
755*dbb99499SAndroid Build Coastguard Workeror where there are only a couple of lines per benchmark. Here's an example of
756*dbb99499SAndroid Build Coastguard Workerthe default output:
757*dbb99499SAndroid Build Coastguard Worker
758*dbb99499SAndroid Build Coastguard Worker```
759*dbb99499SAndroid Build Coastguard Worker------------------------------------------------------------------------------
760*dbb99499SAndroid Build Coastguard WorkerBenchmark                        Time           CPU Iterations UserCounters...
761*dbb99499SAndroid Build Coastguard Worker------------------------------------------------------------------------------
762*dbb99499SAndroid Build Coastguard WorkerBM_UserCounter/threads:8      2248 ns      10277 ns      68808 Bar=16 Bat=40 Baz=24 Foo=8
763*dbb99499SAndroid Build Coastguard WorkerBM_UserCounter/threads:1      9797 ns       9788 ns      71523 Bar=2 Bat=5 Baz=3 Foo=1024m
764*dbb99499SAndroid Build Coastguard WorkerBM_UserCounter/threads:2      4924 ns       9842 ns      71036 Bar=4 Bat=10 Baz=6 Foo=2
765*dbb99499SAndroid Build Coastguard WorkerBM_UserCounter/threads:4      2589 ns      10284 ns      68012 Bar=8 Bat=20 Baz=12 Foo=4
766*dbb99499SAndroid Build Coastguard WorkerBM_UserCounter/threads:8      2212 ns      10287 ns      68040 Bar=16 Bat=40 Baz=24 Foo=8
767*dbb99499SAndroid Build Coastguard WorkerBM_UserCounter/threads:16     1782 ns      10278 ns      68144 Bar=32 Bat=80 Baz=48 Foo=16
768*dbb99499SAndroid Build Coastguard WorkerBM_UserCounter/threads:32     1291 ns      10296 ns      68256 Bar=64 Bat=160 Baz=96 Foo=32
769*dbb99499SAndroid Build Coastguard WorkerBM_UserCounter/threads:4      2615 ns      10307 ns      68040 Bar=8 Bat=20 Baz=12 Foo=4
770*dbb99499SAndroid Build Coastguard WorkerBM_Factorial                    26 ns         26 ns   26608979 40320
771*dbb99499SAndroid Build Coastguard WorkerBM_Factorial/real_time          26 ns         26 ns   26587936 40320
772*dbb99499SAndroid Build Coastguard WorkerBM_CalculatePiRange/1           16 ns         16 ns   45704255 0
773*dbb99499SAndroid Build Coastguard WorkerBM_CalculatePiRange/8           73 ns         73 ns    9520927 3.28374
774*dbb99499SAndroid Build Coastguard WorkerBM_CalculatePiRange/64         609 ns        609 ns    1140647 3.15746
775*dbb99499SAndroid Build Coastguard WorkerBM_CalculatePiRange/512       4900 ns       4901 ns     142696 3.14355
776*dbb99499SAndroid Build Coastguard Worker```
777*dbb99499SAndroid Build Coastguard Worker
778*dbb99499SAndroid Build Coastguard WorkerIf this doesn't suit you, you can print each counter as a table column by
779*dbb99499SAndroid Build Coastguard Workerpassing the flag `--benchmark_counters_tabular=true` to the benchmark
780*dbb99499SAndroid Build Coastguard Workerapplication. This is best for cases in which there are a lot of counters, or
781*dbb99499SAndroid Build Coastguard Workera lot of lines per individual benchmark. Note that this will trigger a
782*dbb99499SAndroid Build Coastguard Workerreprinting of the table header any time the counter set changes between
783*dbb99499SAndroid Build Coastguard Workerindividual benchmarks. Here's an example of corresponding output when
784*dbb99499SAndroid Build Coastguard Worker`--benchmark_counters_tabular=true` is passed:
785*dbb99499SAndroid Build Coastguard Worker
786*dbb99499SAndroid Build Coastguard Worker```
787*dbb99499SAndroid Build Coastguard Worker---------------------------------------------------------------------------------------
788*dbb99499SAndroid Build Coastguard WorkerBenchmark                        Time           CPU Iterations    Bar   Bat   Baz   Foo
789*dbb99499SAndroid Build Coastguard Worker---------------------------------------------------------------------------------------
790*dbb99499SAndroid Build Coastguard WorkerBM_UserCounter/threads:8      2198 ns       9953 ns      70688     16    40    24     8
791*dbb99499SAndroid Build Coastguard WorkerBM_UserCounter/threads:1      9504 ns       9504 ns      73787      2     5     3     1
792*dbb99499SAndroid Build Coastguard WorkerBM_UserCounter/threads:2      4775 ns       9550 ns      72606      4    10     6     2
793*dbb99499SAndroid Build Coastguard WorkerBM_UserCounter/threads:4      2508 ns       9951 ns      70332      8    20    12     4
794*dbb99499SAndroid Build Coastguard WorkerBM_UserCounter/threads:8      2055 ns       9933 ns      70344     16    40    24     8
795*dbb99499SAndroid Build Coastguard WorkerBM_UserCounter/threads:16     1610 ns       9946 ns      70720     32    80    48    16
796*dbb99499SAndroid Build Coastguard WorkerBM_UserCounter/threads:32     1192 ns       9948 ns      70496     64   160    96    32
797*dbb99499SAndroid Build Coastguard WorkerBM_UserCounter/threads:4      2506 ns       9949 ns      70332      8    20    12     4
798*dbb99499SAndroid Build Coastguard Worker--------------------------------------------------------------
799*dbb99499SAndroid Build Coastguard WorkerBenchmark                        Time           CPU Iterations
800*dbb99499SAndroid Build Coastguard Worker--------------------------------------------------------------
801*dbb99499SAndroid Build Coastguard WorkerBM_Factorial                    26 ns         26 ns   26392245 40320
802*dbb99499SAndroid Build Coastguard WorkerBM_Factorial/real_time          26 ns         26 ns   26494107 40320
803*dbb99499SAndroid Build Coastguard WorkerBM_CalculatePiRange/1           15 ns         15 ns   45571597 0
804*dbb99499SAndroid Build Coastguard WorkerBM_CalculatePiRange/8           74 ns         74 ns    9450212 3.28374
805*dbb99499SAndroid Build Coastguard WorkerBM_CalculatePiRange/64         595 ns        595 ns    1173901 3.15746
806*dbb99499SAndroid Build Coastguard WorkerBM_CalculatePiRange/512       4752 ns       4752 ns     147380 3.14355
807*dbb99499SAndroid Build Coastguard WorkerBM_CalculatePiRange/4k       37970 ns      37972 ns      18453 3.14184
808*dbb99499SAndroid Build Coastguard WorkerBM_CalculatePiRange/32k     303733 ns     303744 ns       2305 3.14162
809*dbb99499SAndroid Build Coastguard WorkerBM_CalculatePiRange/256k   2434095 ns    2434186 ns        288 3.1416
810*dbb99499SAndroid Build Coastguard WorkerBM_CalculatePiRange/1024k  9721140 ns    9721413 ns         71 3.14159
811*dbb99499SAndroid Build Coastguard WorkerBM_CalculatePi/threads:8      2255 ns       9943 ns      70936
812*dbb99499SAndroid Build Coastguard Worker```
813*dbb99499SAndroid Build Coastguard Worker
814*dbb99499SAndroid Build Coastguard WorkerNote above the additional header printed when the benchmark changes from
815*dbb99499SAndroid Build Coastguard Worker``BM_UserCounter`` to ``BM_Factorial``. This is because ``BM_Factorial`` does
816*dbb99499SAndroid Build Coastguard Workernot have the same counter set as ``BM_UserCounter``.
817*dbb99499SAndroid Build Coastguard Worker
818*dbb99499SAndroid Build Coastguard Worker<a name="multithreaded-benchmarks"/>
819*dbb99499SAndroid Build Coastguard Worker
820*dbb99499SAndroid Build Coastguard Worker## Multithreaded Benchmarks
821*dbb99499SAndroid Build Coastguard Worker
822*dbb99499SAndroid Build Coastguard WorkerIn a multithreaded test (benchmark invoked by multiple threads simultaneously),
823*dbb99499SAndroid Build Coastguard Workerit is guaranteed that none of the threads will start until all have reached
824*dbb99499SAndroid Build Coastguard Workerthe start of the benchmark loop, and all will have finished before any thread
825*dbb99499SAndroid Build Coastguard Workerexits the benchmark loop. (This behavior is also provided by the `KeepRunning()`
826*dbb99499SAndroid Build Coastguard WorkerAPI) As such, any global setup or teardown can be wrapped in a check against the thread
827*dbb99499SAndroid Build Coastguard Workerindex:
828*dbb99499SAndroid Build Coastguard Worker
829*dbb99499SAndroid Build Coastguard Worker```c++
830*dbb99499SAndroid Build Coastguard Workerstatic void BM_MultiThreaded(benchmark::State& state) {
831*dbb99499SAndroid Build Coastguard Worker  if (state.thread_index() == 0) {
832*dbb99499SAndroid Build Coastguard Worker    // Setup code here.
833*dbb99499SAndroid Build Coastguard Worker  }
834*dbb99499SAndroid Build Coastguard Worker  for (auto _ : state) {
835*dbb99499SAndroid Build Coastguard Worker    // Run the test as normal.
836*dbb99499SAndroid Build Coastguard Worker  }
837*dbb99499SAndroid Build Coastguard Worker  if (state.thread_index() == 0) {
838*dbb99499SAndroid Build Coastguard Worker    // Teardown code here.
839*dbb99499SAndroid Build Coastguard Worker  }
840*dbb99499SAndroid Build Coastguard Worker}
841*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_MultiThreaded)->Threads(2);
842*dbb99499SAndroid Build Coastguard Worker```
843*dbb99499SAndroid Build Coastguard Worker
844*dbb99499SAndroid Build Coastguard WorkerTo run the benchmark across a range of thread counts, instead of `Threads`, use
845*dbb99499SAndroid Build Coastguard Worker`ThreadRange`. This takes two parameters (`min_threads` and `max_threads`) and
846*dbb99499SAndroid Build Coastguard Workerruns the benchmark once for values in the inclusive range. For example:
847*dbb99499SAndroid Build Coastguard Worker
848*dbb99499SAndroid Build Coastguard Worker```c++
849*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_MultiThreaded)->ThreadRange(1, 8);
850*dbb99499SAndroid Build Coastguard Worker```
851*dbb99499SAndroid Build Coastguard Worker
852*dbb99499SAndroid Build Coastguard Workerwill run `BM_MultiThreaded` with thread counts 1, 2, 4, and 8.
853*dbb99499SAndroid Build Coastguard Worker
854*dbb99499SAndroid Build Coastguard WorkerIf the benchmarked code itself uses threads and you want to compare it to
855*dbb99499SAndroid Build Coastguard Workersingle-threaded code, you may want to use real-time ("wallclock") measurements
856*dbb99499SAndroid Build Coastguard Workerfor latency comparisons:
857*dbb99499SAndroid Build Coastguard Worker
858*dbb99499SAndroid Build Coastguard Worker```c++
859*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_test)->Range(8, 8<<10)->UseRealTime();
860*dbb99499SAndroid Build Coastguard Worker```
861*dbb99499SAndroid Build Coastguard Worker
862*dbb99499SAndroid Build Coastguard WorkerWithout `UseRealTime`, CPU time is used by default.
863*dbb99499SAndroid Build Coastguard Worker
864*dbb99499SAndroid Build Coastguard Worker<a name="cpu-timers" />
865*dbb99499SAndroid Build Coastguard Worker
866*dbb99499SAndroid Build Coastguard Worker## CPU Timers
867*dbb99499SAndroid Build Coastguard Worker
868*dbb99499SAndroid Build Coastguard WorkerBy default, the CPU timer only measures the time spent by the main thread.
869*dbb99499SAndroid Build Coastguard WorkerIf the benchmark itself uses threads internally, this measurement may not
870*dbb99499SAndroid Build Coastguard Workerbe what you are looking for. Instead, there is a way to measure the total
871*dbb99499SAndroid Build Coastguard WorkerCPU usage of the process, by all the threads.
872*dbb99499SAndroid Build Coastguard Worker
873*dbb99499SAndroid Build Coastguard Worker```c++
874*dbb99499SAndroid Build Coastguard Workervoid callee(int i);
875*dbb99499SAndroid Build Coastguard Worker
876*dbb99499SAndroid Build Coastguard Workerstatic void MyMain(int size) {
877*dbb99499SAndroid Build Coastguard Worker#pragma omp parallel for
878*dbb99499SAndroid Build Coastguard Worker  for(int i = 0; i < size; i++)
879*dbb99499SAndroid Build Coastguard Worker    callee(i);
880*dbb99499SAndroid Build Coastguard Worker}
881*dbb99499SAndroid Build Coastguard Worker
882*dbb99499SAndroid Build Coastguard Workerstatic void BM_OpenMP(benchmark::State& state) {
883*dbb99499SAndroid Build Coastguard Worker  for (auto _ : state)
884*dbb99499SAndroid Build Coastguard Worker    MyMain(state.range(0));
885*dbb99499SAndroid Build Coastguard Worker}
886*dbb99499SAndroid Build Coastguard Worker
887*dbb99499SAndroid Build Coastguard Worker// Measure the time spent by the main thread, use it to decide for how long to
888*dbb99499SAndroid Build Coastguard Worker// run the benchmark loop. Depending on the internal implementation detail may
889*dbb99499SAndroid Build Coastguard Worker// measure to anywhere from near-zero (the overhead spent before/after work
890*dbb99499SAndroid Build Coastguard Worker// handoff to worker thread[s]) to the whole single-thread time.
891*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_OpenMP)->Range(8, 8<<10);
892*dbb99499SAndroid Build Coastguard Worker
893*dbb99499SAndroid Build Coastguard Worker// Measure the user-visible time, the wall clock (literally, the time that
894*dbb99499SAndroid Build Coastguard Worker// has passed on the clock on the wall), use it to decide for how long to
895*dbb99499SAndroid Build Coastguard Worker// run the benchmark loop. This will always be meaningful, and will match the
896*dbb99499SAndroid Build Coastguard Worker// time spent by the main thread in single-threaded case, in general decreasing
897*dbb99499SAndroid Build Coastguard Worker// with the number of internal threads doing the work.
898*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_OpenMP)->Range(8, 8<<10)->UseRealTime();
899*dbb99499SAndroid Build Coastguard Worker
900*dbb99499SAndroid Build Coastguard Worker// Measure the total CPU consumption, use it to decide for how long to
901*dbb99499SAndroid Build Coastguard Worker// run the benchmark loop. This will always measure to no less than the
902*dbb99499SAndroid Build Coastguard Worker// time spent by the main thread in single-threaded case.
903*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_OpenMP)->Range(8, 8<<10)->MeasureProcessCPUTime();
904*dbb99499SAndroid Build Coastguard Worker
905*dbb99499SAndroid Build Coastguard Worker// A mixture of the last two. Measure the total CPU consumption, but use the
906*dbb99499SAndroid Build Coastguard Worker// wall clock to decide for how long to run the benchmark loop.
907*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_OpenMP)->Range(8, 8<<10)->MeasureProcessCPUTime()->UseRealTime();
908*dbb99499SAndroid Build Coastguard Worker```
909*dbb99499SAndroid Build Coastguard Worker
910*dbb99499SAndroid Build Coastguard Worker### Controlling Timers
911*dbb99499SAndroid Build Coastguard Worker
912*dbb99499SAndroid Build Coastguard WorkerNormally, the entire duration of the work loop (`for (auto _ : state) {}`)
913*dbb99499SAndroid Build Coastguard Workeris measured. But sometimes, it is necessary to do some work inside of
914*dbb99499SAndroid Build Coastguard Workerthat loop, every iteration, but without counting that time to the benchmark time.
915*dbb99499SAndroid Build Coastguard WorkerThat is possible, although it is not recommended, since it has high overhead.
916*dbb99499SAndroid Build Coastguard Worker
917*dbb99499SAndroid Build Coastguard Worker<!-- {% raw %} -->
918*dbb99499SAndroid Build Coastguard Worker```c++
919*dbb99499SAndroid Build Coastguard Workerstatic void BM_SetInsert_With_Timer_Control(benchmark::State& state) {
920*dbb99499SAndroid Build Coastguard Worker  std::set<int> data;
921*dbb99499SAndroid Build Coastguard Worker  for (auto _ : state) {
922*dbb99499SAndroid Build Coastguard Worker    state.PauseTiming(); // Stop timers. They will not count until they are resumed.
923*dbb99499SAndroid Build Coastguard Worker    data = ConstructRandomSet(state.range(0)); // Do something that should not be measured
924*dbb99499SAndroid Build Coastguard Worker    state.ResumeTiming(); // And resume timers. They are now counting again.
925*dbb99499SAndroid Build Coastguard Worker    // The rest will be measured.
926*dbb99499SAndroid Build Coastguard Worker    for (int j = 0; j < state.range(1); ++j)
927*dbb99499SAndroid Build Coastguard Worker      data.insert(RandomNumber());
928*dbb99499SAndroid Build Coastguard Worker  }
929*dbb99499SAndroid Build Coastguard Worker}
930*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_SetInsert_With_Timer_Control)->Ranges({{1<<10, 8<<10}, {128, 512}});
931*dbb99499SAndroid Build Coastguard Worker```
932*dbb99499SAndroid Build Coastguard Worker<!-- {% endraw %} -->
933*dbb99499SAndroid Build Coastguard Worker
934*dbb99499SAndroid Build Coastguard Worker<a name="manual-timing" />
935*dbb99499SAndroid Build Coastguard Worker
936*dbb99499SAndroid Build Coastguard Worker## Manual Timing
937*dbb99499SAndroid Build Coastguard Worker
938*dbb99499SAndroid Build Coastguard WorkerFor benchmarking something for which neither CPU time nor real-time are
939*dbb99499SAndroid Build Coastguard Workercorrect or accurate enough, completely manual timing is supported using
940*dbb99499SAndroid Build Coastguard Workerthe `UseManualTime` function.
941*dbb99499SAndroid Build Coastguard Worker
942*dbb99499SAndroid Build Coastguard WorkerWhen `UseManualTime` is used, the benchmarked code must call
943*dbb99499SAndroid Build Coastguard Worker`SetIterationTime` once per iteration of the benchmark loop to
944*dbb99499SAndroid Build Coastguard Workerreport the manually measured time.
945*dbb99499SAndroid Build Coastguard Worker
946*dbb99499SAndroid Build Coastguard WorkerAn example use case for this is benchmarking GPU execution (e.g. OpenCL
947*dbb99499SAndroid Build Coastguard Workeror CUDA kernels, OpenGL or Vulkan or Direct3D draw calls), which cannot
948*dbb99499SAndroid Build Coastguard Workerbe accurately measured using CPU time or real-time. Instead, they can be
949*dbb99499SAndroid Build Coastguard Workermeasured accurately using a dedicated API, and these measurement results
950*dbb99499SAndroid Build Coastguard Workercan be reported back with `SetIterationTime`.
951*dbb99499SAndroid Build Coastguard Worker
952*dbb99499SAndroid Build Coastguard Worker```c++
953*dbb99499SAndroid Build Coastguard Workerstatic void BM_ManualTiming(benchmark::State& state) {
954*dbb99499SAndroid Build Coastguard Worker  int microseconds = state.range(0);
955*dbb99499SAndroid Build Coastguard Worker  std::chrono::duration<double, std::micro> sleep_duration {
956*dbb99499SAndroid Build Coastguard Worker    static_cast<double>(microseconds)
957*dbb99499SAndroid Build Coastguard Worker  };
958*dbb99499SAndroid Build Coastguard Worker
959*dbb99499SAndroid Build Coastguard Worker  for (auto _ : state) {
960*dbb99499SAndroid Build Coastguard Worker    auto start = std::chrono::high_resolution_clock::now();
961*dbb99499SAndroid Build Coastguard Worker    // Simulate some useful workload with a sleep
962*dbb99499SAndroid Build Coastguard Worker    std::this_thread::sleep_for(sleep_duration);
963*dbb99499SAndroid Build Coastguard Worker    auto end = std::chrono::high_resolution_clock::now();
964*dbb99499SAndroid Build Coastguard Worker
965*dbb99499SAndroid Build Coastguard Worker    auto elapsed_seconds =
966*dbb99499SAndroid Build Coastguard Worker      std::chrono::duration_cast<std::chrono::duration<double>>(
967*dbb99499SAndroid Build Coastguard Worker        end - start);
968*dbb99499SAndroid Build Coastguard Worker
969*dbb99499SAndroid Build Coastguard Worker    state.SetIterationTime(elapsed_seconds.count());
970*dbb99499SAndroid Build Coastguard Worker  }
971*dbb99499SAndroid Build Coastguard Worker}
972*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_ManualTiming)->Range(1, 1<<17)->UseManualTime();
973*dbb99499SAndroid Build Coastguard Worker```
974*dbb99499SAndroid Build Coastguard Worker
975*dbb99499SAndroid Build Coastguard Worker<a name="setting-the-time-unit" />
976*dbb99499SAndroid Build Coastguard Worker
977*dbb99499SAndroid Build Coastguard Worker## Setting the Time Unit
978*dbb99499SAndroid Build Coastguard Worker
979*dbb99499SAndroid Build Coastguard WorkerIf a benchmark runs a few milliseconds it may be hard to visually compare the
980*dbb99499SAndroid Build Coastguard Workermeasured times, since the output data is given in nanoseconds per default. In
981*dbb99499SAndroid Build Coastguard Workerorder to manually set the time unit, you can specify it manually:
982*dbb99499SAndroid Build Coastguard Worker
983*dbb99499SAndroid Build Coastguard Worker```c++
984*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_test)->Unit(benchmark::kMillisecond);
985*dbb99499SAndroid Build Coastguard Worker```
986*dbb99499SAndroid Build Coastguard Worker
987*dbb99499SAndroid Build Coastguard WorkerAdditionally the default time unit can be set globally with the
988*dbb99499SAndroid Build Coastguard Worker`--benchmark_time_unit={ns|us|ms|s}` command line argument. The argument only
989*dbb99499SAndroid Build Coastguard Workeraffects benchmarks where the time unit is not set explicitly.
990*dbb99499SAndroid Build Coastguard Worker
991*dbb99499SAndroid Build Coastguard Worker<a name="preventing-optimization" />
992*dbb99499SAndroid Build Coastguard Worker
993*dbb99499SAndroid Build Coastguard Worker## Preventing Optimization
994*dbb99499SAndroid Build Coastguard Worker
995*dbb99499SAndroid Build Coastguard WorkerTo prevent a value or expression from being optimized away by the compiler
996*dbb99499SAndroid Build Coastguard Workerthe `benchmark::DoNotOptimize(...)` and `benchmark::ClobberMemory()`
997*dbb99499SAndroid Build Coastguard Workerfunctions can be used.
998*dbb99499SAndroid Build Coastguard Worker
999*dbb99499SAndroid Build Coastguard Worker```c++
1000*dbb99499SAndroid Build Coastguard Workerstatic void BM_test(benchmark::State& state) {
1001*dbb99499SAndroid Build Coastguard Worker  for (auto _ : state) {
1002*dbb99499SAndroid Build Coastguard Worker      int x = 0;
1003*dbb99499SAndroid Build Coastguard Worker      for (int i=0; i < 64; ++i) {
1004*dbb99499SAndroid Build Coastguard Worker        benchmark::DoNotOptimize(x += i);
1005*dbb99499SAndroid Build Coastguard Worker      }
1006*dbb99499SAndroid Build Coastguard Worker  }
1007*dbb99499SAndroid Build Coastguard Worker}
1008*dbb99499SAndroid Build Coastguard Worker```
1009*dbb99499SAndroid Build Coastguard Worker
1010*dbb99499SAndroid Build Coastguard Worker`DoNotOptimize(<expr>)` forces the  *result* of `<expr>` to be stored in either
1011*dbb99499SAndroid Build Coastguard Workermemory or a register. For GNU based compilers it acts as read/write barrier
1012*dbb99499SAndroid Build Coastguard Workerfor global memory. More specifically it forces the compiler to flush pending
1013*dbb99499SAndroid Build Coastguard Workerwrites to memory and reload any other values as necessary.
1014*dbb99499SAndroid Build Coastguard Worker
1015*dbb99499SAndroid Build Coastguard WorkerNote that `DoNotOptimize(<expr>)` does not prevent optimizations on `<expr>`
1016*dbb99499SAndroid Build Coastguard Workerin any way. `<expr>` may even be removed entirely when the result is already
1017*dbb99499SAndroid Build Coastguard Workerknown. For example:
1018*dbb99499SAndroid Build Coastguard Worker
1019*dbb99499SAndroid Build Coastguard Worker```c++
1020*dbb99499SAndroid Build Coastguard Worker  // Example 1: `<expr>` is removed entirely.
1021*dbb99499SAndroid Build Coastguard Worker  int foo(int x) { return x + 42; }
1022*dbb99499SAndroid Build Coastguard Worker  while (...) DoNotOptimize(foo(0)); // Optimized to DoNotOptimize(42);
1023*dbb99499SAndroid Build Coastguard Worker
1024*dbb99499SAndroid Build Coastguard Worker  // Example 2: Result of '<expr>' is only reused.
1025*dbb99499SAndroid Build Coastguard Worker  int bar(int) __attribute__((const));
1026*dbb99499SAndroid Build Coastguard Worker  while (...) DoNotOptimize(bar(0)); // Optimized to:
1027*dbb99499SAndroid Build Coastguard Worker  // int __result__ = bar(0);
1028*dbb99499SAndroid Build Coastguard Worker  // while (...) DoNotOptimize(__result__);
1029*dbb99499SAndroid Build Coastguard Worker```
1030*dbb99499SAndroid Build Coastguard Worker
1031*dbb99499SAndroid Build Coastguard WorkerThe second tool for preventing optimizations is `ClobberMemory()`. In essence
1032*dbb99499SAndroid Build Coastguard Worker`ClobberMemory()` forces the compiler to perform all pending writes to global
1033*dbb99499SAndroid Build Coastguard Workermemory. Memory managed by block scope objects must be "escaped" using
1034*dbb99499SAndroid Build Coastguard Worker`DoNotOptimize(...)` before it can be clobbered. In the below example
1035*dbb99499SAndroid Build Coastguard Worker`ClobberMemory()` prevents the call to `v.push_back(42)` from being optimized
1036*dbb99499SAndroid Build Coastguard Workeraway.
1037*dbb99499SAndroid Build Coastguard Worker
1038*dbb99499SAndroid Build Coastguard Worker```c++
1039*dbb99499SAndroid Build Coastguard Workerstatic void BM_vector_push_back(benchmark::State& state) {
1040*dbb99499SAndroid Build Coastguard Worker  for (auto _ : state) {
1041*dbb99499SAndroid Build Coastguard Worker    std::vector<int> v;
1042*dbb99499SAndroid Build Coastguard Worker    v.reserve(1);
1043*dbb99499SAndroid Build Coastguard Worker    auto data = v.data();           // Allow v.data() to be clobbered. Pass as non-const
1044*dbb99499SAndroid Build Coastguard Worker    benchmark::DoNotOptimize(data); // lvalue to avoid undesired compiler optimizations
1045*dbb99499SAndroid Build Coastguard Worker    v.push_back(42);
1046*dbb99499SAndroid Build Coastguard Worker    benchmark::ClobberMemory(); // Force 42 to be written to memory.
1047*dbb99499SAndroid Build Coastguard Worker  }
1048*dbb99499SAndroid Build Coastguard Worker}
1049*dbb99499SAndroid Build Coastguard Worker```
1050*dbb99499SAndroid Build Coastguard Worker
1051*dbb99499SAndroid Build Coastguard WorkerNote that `ClobberMemory()` is only available for GNU or MSVC based compilers.
1052*dbb99499SAndroid Build Coastguard Worker
1053*dbb99499SAndroid Build Coastguard Worker<a name="reporting-statistics" />
1054*dbb99499SAndroid Build Coastguard Worker
1055*dbb99499SAndroid Build Coastguard Worker## Statistics: Reporting the Mean, Median and Standard Deviation / Coefficient of variation of Repeated Benchmarks
1056*dbb99499SAndroid Build Coastguard Worker
1057*dbb99499SAndroid Build Coastguard WorkerBy default each benchmark is run once and that single result is reported.
1058*dbb99499SAndroid Build Coastguard WorkerHowever benchmarks are often noisy and a single result may not be representative
1059*dbb99499SAndroid Build Coastguard Workerof the overall behavior. For this reason it's possible to repeatedly rerun the
1060*dbb99499SAndroid Build Coastguard Workerbenchmark.
1061*dbb99499SAndroid Build Coastguard Worker
1062*dbb99499SAndroid Build Coastguard WorkerThe number of runs of each benchmark is specified globally by the
1063*dbb99499SAndroid Build Coastguard Worker`--benchmark_repetitions` flag or on a per benchmark basis by calling
1064*dbb99499SAndroid Build Coastguard Worker`Repetitions` on the registered benchmark object. When a benchmark is run more
1065*dbb99499SAndroid Build Coastguard Workerthan once the mean, median, standard deviation and coefficient of variation
1066*dbb99499SAndroid Build Coastguard Workerof the runs will be reported.
1067*dbb99499SAndroid Build Coastguard Worker
1068*dbb99499SAndroid Build Coastguard WorkerAdditionally the `--benchmark_report_aggregates_only={true|false}`,
1069*dbb99499SAndroid Build Coastguard Worker`--benchmark_display_aggregates_only={true|false}` flags or
1070*dbb99499SAndroid Build Coastguard Worker`ReportAggregatesOnly(bool)`, `DisplayAggregatesOnly(bool)` functions can be
1071*dbb99499SAndroid Build Coastguard Workerused to change how repeated tests are reported. By default the result of each
1072*dbb99499SAndroid Build Coastguard Workerrepeated run is reported. When `report aggregates only` option is `true`,
1073*dbb99499SAndroid Build Coastguard Workeronly the aggregates (i.e. mean, median, standard deviation and coefficient
1074*dbb99499SAndroid Build Coastguard Workerof variation, maybe complexity measurements if they were requested) of the runs
1075*dbb99499SAndroid Build Coastguard Workeris reported, to both the reporters - standard output (console), and the file.
1076*dbb99499SAndroid Build Coastguard WorkerHowever when only the `display aggregates only` option is `true`,
1077*dbb99499SAndroid Build Coastguard Workeronly the aggregates are displayed in the standard output, while the file
1078*dbb99499SAndroid Build Coastguard Workeroutput still contains everything.
1079*dbb99499SAndroid Build Coastguard WorkerCalling `ReportAggregatesOnly(bool)` / `DisplayAggregatesOnly(bool)` on a
1080*dbb99499SAndroid Build Coastguard Workerregistered benchmark object overrides the value of the appropriate flag for that
1081*dbb99499SAndroid Build Coastguard Workerbenchmark.
1082*dbb99499SAndroid Build Coastguard Worker
1083*dbb99499SAndroid Build Coastguard Worker<a name="custom-statistics" />
1084*dbb99499SAndroid Build Coastguard Worker
1085*dbb99499SAndroid Build Coastguard Worker## Custom Statistics
1086*dbb99499SAndroid Build Coastguard Worker
1087*dbb99499SAndroid Build Coastguard WorkerWhile having these aggregates is nice, this may not be enough for everyone.
1088*dbb99499SAndroid Build Coastguard WorkerFor example you may want to know what the largest observation is, e.g. because
1089*dbb99499SAndroid Build Coastguard Workeryou have some real-time constraints. This is easy. The following code will
1090*dbb99499SAndroid Build Coastguard Workerspecify a custom statistic to be calculated, defined by a lambda function.
1091*dbb99499SAndroid Build Coastguard Worker
1092*dbb99499SAndroid Build Coastguard Worker```c++
1093*dbb99499SAndroid Build Coastguard Workervoid BM_spin_empty(benchmark::State& state) {
1094*dbb99499SAndroid Build Coastguard Worker  for (auto _ : state) {
1095*dbb99499SAndroid Build Coastguard Worker    for (int x = 0; x < state.range(0); ++x) {
1096*dbb99499SAndroid Build Coastguard Worker      benchmark::DoNotOptimize(x);
1097*dbb99499SAndroid Build Coastguard Worker    }
1098*dbb99499SAndroid Build Coastguard Worker  }
1099*dbb99499SAndroid Build Coastguard Worker}
1100*dbb99499SAndroid Build Coastguard Worker
1101*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_spin_empty)
1102*dbb99499SAndroid Build Coastguard Worker  ->ComputeStatistics("max", [](const std::vector<double>& v) -> double {
1103*dbb99499SAndroid Build Coastguard Worker    return *(std::max_element(std::begin(v), std::end(v)));
1104*dbb99499SAndroid Build Coastguard Worker  })
1105*dbb99499SAndroid Build Coastguard Worker  ->Arg(512);
1106*dbb99499SAndroid Build Coastguard Worker```
1107*dbb99499SAndroid Build Coastguard Worker
1108*dbb99499SAndroid Build Coastguard WorkerWhile usually the statistics produce values in time units,
1109*dbb99499SAndroid Build Coastguard Workeryou can also produce percentages:
1110*dbb99499SAndroid Build Coastguard Worker
1111*dbb99499SAndroid Build Coastguard Worker```c++
1112*dbb99499SAndroid Build Coastguard Workervoid BM_spin_empty(benchmark::State& state) {
1113*dbb99499SAndroid Build Coastguard Worker  for (auto _ : state) {
1114*dbb99499SAndroid Build Coastguard Worker    for (int x = 0; x < state.range(0); ++x) {
1115*dbb99499SAndroid Build Coastguard Worker      benchmark::DoNotOptimize(x);
1116*dbb99499SAndroid Build Coastguard Worker    }
1117*dbb99499SAndroid Build Coastguard Worker  }
1118*dbb99499SAndroid Build Coastguard Worker}
1119*dbb99499SAndroid Build Coastguard Worker
1120*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_spin_empty)
1121*dbb99499SAndroid Build Coastguard Worker  ->ComputeStatistics("ratio", [](const std::vector<double>& v) -> double {
1122*dbb99499SAndroid Build Coastguard Worker    return std::begin(v) / std::end(v);
1123*dbb99499SAndroid Build Coastguard Worker  }, benchmark::StatisticUnit::kPercentage)
1124*dbb99499SAndroid Build Coastguard Worker  ->Arg(512);
1125*dbb99499SAndroid Build Coastguard Worker```
1126*dbb99499SAndroid Build Coastguard Worker
1127*dbb99499SAndroid Build Coastguard Worker<a name="memory-usage" />
1128*dbb99499SAndroid Build Coastguard Worker
1129*dbb99499SAndroid Build Coastguard Worker## Memory Usage
1130*dbb99499SAndroid Build Coastguard Worker
1131*dbb99499SAndroid Build Coastguard WorkerIt's often useful to also track memory usage for benchmarks, alongside CPU
1132*dbb99499SAndroid Build Coastguard Workerperformance. For this reason, benchmark offers the `RegisterMemoryManager`
1133*dbb99499SAndroid Build Coastguard Workermethod that allows a custom `MemoryManager` to be injected.
1134*dbb99499SAndroid Build Coastguard Worker
1135*dbb99499SAndroid Build Coastguard WorkerIf set, the `MemoryManager::Start` and `MemoryManager::Stop` methods will be
1136*dbb99499SAndroid Build Coastguard Workercalled at the start and end of benchmark runs to allow user code to fill out
1137*dbb99499SAndroid Build Coastguard Workera report on the number of allocations, bytes used, etc.
1138*dbb99499SAndroid Build Coastguard Worker
1139*dbb99499SAndroid Build Coastguard WorkerThis data will then be reported alongside other performance data, currently
1140*dbb99499SAndroid Build Coastguard Workeronly when using JSON output.
1141*dbb99499SAndroid Build Coastguard Worker
1142*dbb99499SAndroid Build Coastguard Worker<a name="profiling" />
1143*dbb99499SAndroid Build Coastguard Worker
1144*dbb99499SAndroid Build Coastguard Worker## Profiling
1145*dbb99499SAndroid Build Coastguard Worker
1146*dbb99499SAndroid Build Coastguard WorkerIt's often useful to also profile benchmarks in particular ways, in addition to
1147*dbb99499SAndroid Build Coastguard WorkerCPU performance. For this reason, benchmark offers the `RegisterProfilerManager`
1148*dbb99499SAndroid Build Coastguard Workermethod that allows a custom `ProfilerManager` to be injected.
1149*dbb99499SAndroid Build Coastguard Worker
1150*dbb99499SAndroid Build Coastguard WorkerIf set, the `ProfilerManager::AfterSetupStart` and
1151*dbb99499SAndroid Build Coastguard Worker`ProfilerManager::BeforeTeardownStop` methods will be called at the start and
1152*dbb99499SAndroid Build Coastguard Workerend of a separate benchmark run to allow user code to collect and report
1153*dbb99499SAndroid Build Coastguard Workeruser-provided profile metrics.
1154*dbb99499SAndroid Build Coastguard Worker
1155*dbb99499SAndroid Build Coastguard WorkerOutput collected from this profiling run must be reported separately.
1156*dbb99499SAndroid Build Coastguard Worker
1157*dbb99499SAndroid Build Coastguard Worker<a name="using-register-benchmark" />
1158*dbb99499SAndroid Build Coastguard Worker
1159*dbb99499SAndroid Build Coastguard Worker## Using RegisterBenchmark(name, fn, args...)
1160*dbb99499SAndroid Build Coastguard Worker
1161*dbb99499SAndroid Build Coastguard WorkerThe `RegisterBenchmark(name, func, args...)` function provides an alternative
1162*dbb99499SAndroid Build Coastguard Workerway to create and register benchmarks.
1163*dbb99499SAndroid Build Coastguard Worker`RegisterBenchmark(name, func, args...)` creates, registers, and returns a
1164*dbb99499SAndroid Build Coastguard Workerpointer to a new benchmark with the specified `name` that invokes
1165*dbb99499SAndroid Build Coastguard Worker`func(st, args...)` where `st` is a `benchmark::State` object.
1166*dbb99499SAndroid Build Coastguard Worker
1167*dbb99499SAndroid Build Coastguard WorkerUnlike the `BENCHMARK` registration macros, which can only be used at the global
1168*dbb99499SAndroid Build Coastguard Workerscope, the `RegisterBenchmark` can be called anywhere. This allows for
1169*dbb99499SAndroid Build Coastguard Workerbenchmark tests to be registered programmatically.
1170*dbb99499SAndroid Build Coastguard Worker
1171*dbb99499SAndroid Build Coastguard WorkerAdditionally `RegisterBenchmark` allows any callable object to be registered
1172*dbb99499SAndroid Build Coastguard Workeras a benchmark. Including capturing lambdas and function objects.
1173*dbb99499SAndroid Build Coastguard Worker
1174*dbb99499SAndroid Build Coastguard WorkerFor Example:
1175*dbb99499SAndroid Build Coastguard Worker```c++
1176*dbb99499SAndroid Build Coastguard Workerauto BM_test = [](benchmark::State& st, auto Inputs) { /* ... */ };
1177*dbb99499SAndroid Build Coastguard Worker
1178*dbb99499SAndroid Build Coastguard Workerint main(int argc, char** argv) {
1179*dbb99499SAndroid Build Coastguard Worker  for (auto& test_input : { /* ... */ })
1180*dbb99499SAndroid Build Coastguard Worker      benchmark::RegisterBenchmark(test_input.name(), BM_test, test_input);
1181*dbb99499SAndroid Build Coastguard Worker  benchmark::Initialize(&argc, argv);
1182*dbb99499SAndroid Build Coastguard Worker  benchmark::RunSpecifiedBenchmarks();
1183*dbb99499SAndroid Build Coastguard Worker  benchmark::Shutdown();
1184*dbb99499SAndroid Build Coastguard Worker}
1185*dbb99499SAndroid Build Coastguard Worker```
1186*dbb99499SAndroid Build Coastguard Worker
1187*dbb99499SAndroid Build Coastguard Worker<a name="exiting-with-an-error" />
1188*dbb99499SAndroid Build Coastguard Worker
1189*dbb99499SAndroid Build Coastguard Worker## Exiting with an Error
1190*dbb99499SAndroid Build Coastguard Worker
1191*dbb99499SAndroid Build Coastguard WorkerWhen errors caused by external influences, such as file I/O and network
1192*dbb99499SAndroid Build Coastguard Workercommunication, occur within a benchmark the
1193*dbb99499SAndroid Build Coastguard Worker`State::SkipWithError(const std::string& msg)` function can be used to skip that run
1194*dbb99499SAndroid Build Coastguard Workerof benchmark and report the error. Note that only future iterations of the
1195*dbb99499SAndroid Build Coastguard Worker`KeepRunning()` are skipped. For the ranged-for version of the benchmark loop
1196*dbb99499SAndroid Build Coastguard WorkerUsers must explicitly exit the loop, otherwise all iterations will be performed.
1197*dbb99499SAndroid Build Coastguard WorkerUsers may explicitly return to exit the benchmark immediately.
1198*dbb99499SAndroid Build Coastguard Worker
1199*dbb99499SAndroid Build Coastguard WorkerThe `SkipWithError(...)` function may be used at any point within the benchmark,
1200*dbb99499SAndroid Build Coastguard Workerincluding before and after the benchmark loop. Moreover, if `SkipWithError(...)`
1201*dbb99499SAndroid Build Coastguard Workerhas been used, it is not required to reach the benchmark loop and one may return
1202*dbb99499SAndroid Build Coastguard Workerfrom the benchmark function early.
1203*dbb99499SAndroid Build Coastguard Worker
1204*dbb99499SAndroid Build Coastguard WorkerFor example:
1205*dbb99499SAndroid Build Coastguard Worker
1206*dbb99499SAndroid Build Coastguard Worker```c++
1207*dbb99499SAndroid Build Coastguard Workerstatic void BM_test(benchmark::State& state) {
1208*dbb99499SAndroid Build Coastguard Worker  auto resource = GetResource();
1209*dbb99499SAndroid Build Coastguard Worker  if (!resource.good()) {
1210*dbb99499SAndroid Build Coastguard Worker    state.SkipWithError("Resource is not good!");
1211*dbb99499SAndroid Build Coastguard Worker    // KeepRunning() loop will not be entered.
1212*dbb99499SAndroid Build Coastguard Worker  }
1213*dbb99499SAndroid Build Coastguard Worker  while (state.KeepRunning()) {
1214*dbb99499SAndroid Build Coastguard Worker    auto data = resource.read_data();
1215*dbb99499SAndroid Build Coastguard Worker    if (!resource.good()) {
1216*dbb99499SAndroid Build Coastguard Worker      state.SkipWithError("Failed to read data!");
1217*dbb99499SAndroid Build Coastguard Worker      break; // Needed to skip the rest of the iteration.
1218*dbb99499SAndroid Build Coastguard Worker    }
1219*dbb99499SAndroid Build Coastguard Worker    do_stuff(data);
1220*dbb99499SAndroid Build Coastguard Worker  }
1221*dbb99499SAndroid Build Coastguard Worker}
1222*dbb99499SAndroid Build Coastguard Worker
1223*dbb99499SAndroid Build Coastguard Workerstatic void BM_test_ranged_fo(benchmark::State & state) {
1224*dbb99499SAndroid Build Coastguard Worker  auto resource = GetResource();
1225*dbb99499SAndroid Build Coastguard Worker  if (!resource.good()) {
1226*dbb99499SAndroid Build Coastguard Worker    state.SkipWithError("Resource is not good!");
1227*dbb99499SAndroid Build Coastguard Worker    return; // Early return is allowed when SkipWithError() has been used.
1228*dbb99499SAndroid Build Coastguard Worker  }
1229*dbb99499SAndroid Build Coastguard Worker  for (auto _ : state) {
1230*dbb99499SAndroid Build Coastguard Worker    auto data = resource.read_data();
1231*dbb99499SAndroid Build Coastguard Worker    if (!resource.good()) {
1232*dbb99499SAndroid Build Coastguard Worker      state.SkipWithError("Failed to read data!");
1233*dbb99499SAndroid Build Coastguard Worker      break; // REQUIRED to prevent all further iterations.
1234*dbb99499SAndroid Build Coastguard Worker    }
1235*dbb99499SAndroid Build Coastguard Worker    do_stuff(data);
1236*dbb99499SAndroid Build Coastguard Worker  }
1237*dbb99499SAndroid Build Coastguard Worker}
1238*dbb99499SAndroid Build Coastguard Worker```
1239*dbb99499SAndroid Build Coastguard Worker<a name="a-faster-keep-running-loop" />
1240*dbb99499SAndroid Build Coastguard Worker
1241*dbb99499SAndroid Build Coastguard Worker## A Faster KeepRunning Loop
1242*dbb99499SAndroid Build Coastguard Worker
1243*dbb99499SAndroid Build Coastguard WorkerIn C++11 mode, a ranged-based for loop should be used in preference to
1244*dbb99499SAndroid Build Coastguard Workerthe `KeepRunning` loop for running the benchmarks. For example:
1245*dbb99499SAndroid Build Coastguard Worker
1246*dbb99499SAndroid Build Coastguard Worker```c++
1247*dbb99499SAndroid Build Coastguard Workerstatic void BM_Fast(benchmark::State &state) {
1248*dbb99499SAndroid Build Coastguard Worker  for (auto _ : state) {
1249*dbb99499SAndroid Build Coastguard Worker    FastOperation();
1250*dbb99499SAndroid Build Coastguard Worker  }
1251*dbb99499SAndroid Build Coastguard Worker}
1252*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_Fast);
1253*dbb99499SAndroid Build Coastguard Worker```
1254*dbb99499SAndroid Build Coastguard Worker
1255*dbb99499SAndroid Build Coastguard WorkerThe reason the ranged-for loop is faster than using `KeepRunning`, is
1256*dbb99499SAndroid Build Coastguard Workerbecause `KeepRunning` requires a memory load and store of the iteration count
1257*dbb99499SAndroid Build Coastguard Workerever iteration, whereas the ranged-for variant is able to keep the iteration count
1258*dbb99499SAndroid Build Coastguard Workerin a register.
1259*dbb99499SAndroid Build Coastguard Worker
1260*dbb99499SAndroid Build Coastguard WorkerFor example, an empty inner loop of using the ranged-based for method looks like:
1261*dbb99499SAndroid Build Coastguard Worker
1262*dbb99499SAndroid Build Coastguard Worker```asm
1263*dbb99499SAndroid Build Coastguard Worker# Loop Init
1264*dbb99499SAndroid Build Coastguard Worker  mov rbx, qword ptr [r14 + 104]
1265*dbb99499SAndroid Build Coastguard Worker  call benchmark::State::StartKeepRunning()
1266*dbb99499SAndroid Build Coastguard Worker  test rbx, rbx
1267*dbb99499SAndroid Build Coastguard Worker  je .LoopEnd
1268*dbb99499SAndroid Build Coastguard Worker.LoopHeader: # =>This Inner Loop Header: Depth=1
1269*dbb99499SAndroid Build Coastguard Worker  add rbx, -1
1270*dbb99499SAndroid Build Coastguard Worker  jne .LoopHeader
1271*dbb99499SAndroid Build Coastguard Worker.LoopEnd:
1272*dbb99499SAndroid Build Coastguard Worker```
1273*dbb99499SAndroid Build Coastguard Worker
1274*dbb99499SAndroid Build Coastguard WorkerCompared to an empty `KeepRunning` loop, which looks like:
1275*dbb99499SAndroid Build Coastguard Worker
1276*dbb99499SAndroid Build Coastguard Worker```asm
1277*dbb99499SAndroid Build Coastguard Worker.LoopHeader: # in Loop: Header=BB0_3 Depth=1
1278*dbb99499SAndroid Build Coastguard Worker  cmp byte ptr [rbx], 1
1279*dbb99499SAndroid Build Coastguard Worker  jne .LoopInit
1280*dbb99499SAndroid Build Coastguard Worker.LoopBody: # =>This Inner Loop Header: Depth=1
1281*dbb99499SAndroid Build Coastguard Worker  mov rax, qword ptr [rbx + 8]
1282*dbb99499SAndroid Build Coastguard Worker  lea rcx, [rax + 1]
1283*dbb99499SAndroid Build Coastguard Worker  mov qword ptr [rbx + 8], rcx
1284*dbb99499SAndroid Build Coastguard Worker  cmp rax, qword ptr [rbx + 104]
1285*dbb99499SAndroid Build Coastguard Worker  jb .LoopHeader
1286*dbb99499SAndroid Build Coastguard Worker  jmp .LoopEnd
1287*dbb99499SAndroid Build Coastguard Worker.LoopInit:
1288*dbb99499SAndroid Build Coastguard Worker  mov rdi, rbx
1289*dbb99499SAndroid Build Coastguard Worker  call benchmark::State::StartKeepRunning()
1290*dbb99499SAndroid Build Coastguard Worker  jmp .LoopBody
1291*dbb99499SAndroid Build Coastguard Worker.LoopEnd:
1292*dbb99499SAndroid Build Coastguard Worker```
1293*dbb99499SAndroid Build Coastguard Worker
1294*dbb99499SAndroid Build Coastguard WorkerUnless C++03 compatibility is required, the ranged-for variant of writing
1295*dbb99499SAndroid Build Coastguard Workerthe benchmark loop should be preferred.
1296*dbb99499SAndroid Build Coastguard Worker
1297*dbb99499SAndroid Build Coastguard Worker<a name="disabling-cpu-frequency-scaling" />
1298*dbb99499SAndroid Build Coastguard Worker
1299*dbb99499SAndroid Build Coastguard Worker## Disabling CPU Frequency Scaling
1300*dbb99499SAndroid Build Coastguard Worker
1301*dbb99499SAndroid Build Coastguard WorkerIf you see this error:
1302*dbb99499SAndroid Build Coastguard Worker
1303*dbb99499SAndroid Build Coastguard Worker```
1304*dbb99499SAndroid Build Coastguard Worker***WARNING*** CPU scaling is enabled, the benchmark real time measurements may
1305*dbb99499SAndroid Build Coastguard Workerbe noisy and will incur extra overhead.
1306*dbb99499SAndroid Build Coastguard Worker```
1307*dbb99499SAndroid Build Coastguard Worker
1308*dbb99499SAndroid Build Coastguard Workeryou might want to disable the CPU frequency scaling while running the
1309*dbb99499SAndroid Build Coastguard Workerbenchmark, as well as consider other ways to stabilize the performance of
1310*dbb99499SAndroid Build Coastguard Workeryour system while benchmarking.
1311*dbb99499SAndroid Build Coastguard Worker
1312*dbb99499SAndroid Build Coastguard WorkerSee [Reducing Variance](reducing_variance.md) for more information.
1313