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