1*dbb99499SAndroid Build Coastguard Worker# Benchmark 2*dbb99499SAndroid Build Coastguard Worker 3*dbb99499SAndroid Build Coastguard Worker[](https://github.com/google/benchmark/actions?query=workflow%3Abuild-and-test) 4*dbb99499SAndroid Build Coastguard Worker[](https://github.com/google/benchmark/actions/workflows/bazel.yml) 5*dbb99499SAndroid Build Coastguard Worker[](https://github.com/google/benchmark/actions?query=workflow%3Apylint) 6*dbb99499SAndroid Build Coastguard Worker[](https://github.com/google/benchmark/actions?query=workflow%3Atest-bindings) 7*dbb99499SAndroid Build Coastguard Worker[](https://coveralls.io/r/google/benchmark) 8*dbb99499SAndroid Build Coastguard Worker 9*dbb99499SAndroid Build Coastguard Worker[](https://discord.gg/cz7UX7wKC2) 10*dbb99499SAndroid Build Coastguard Worker 11*dbb99499SAndroid Build Coastguard WorkerA library to benchmark code snippets, similar to unit tests. Example: 12*dbb99499SAndroid Build Coastguard Worker 13*dbb99499SAndroid Build Coastguard Worker```c++ 14*dbb99499SAndroid Build Coastguard Worker#include <benchmark/benchmark.h> 15*dbb99499SAndroid Build Coastguard Worker 16*dbb99499SAndroid Build Coastguard Workerstatic void BM_SomeFunction(benchmark::State& state) { 17*dbb99499SAndroid Build Coastguard Worker // Perform setup here 18*dbb99499SAndroid Build Coastguard Worker for (auto _ : state) { 19*dbb99499SAndroid Build Coastguard Worker // This code gets timed 20*dbb99499SAndroid Build Coastguard Worker SomeFunction(); 21*dbb99499SAndroid Build Coastguard Worker } 22*dbb99499SAndroid Build Coastguard Worker} 23*dbb99499SAndroid Build Coastguard Worker// Register the function as a benchmark 24*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_SomeFunction); 25*dbb99499SAndroid Build Coastguard Worker// Run the benchmark 26*dbb99499SAndroid Build Coastguard WorkerBENCHMARK_MAIN(); 27*dbb99499SAndroid Build Coastguard Worker``` 28*dbb99499SAndroid Build Coastguard Worker 29*dbb99499SAndroid Build Coastguard Worker## Getting Started 30*dbb99499SAndroid Build Coastguard Worker 31*dbb99499SAndroid Build Coastguard WorkerTo get started, see [Requirements](#requirements) and 32*dbb99499SAndroid Build Coastguard Worker[Installation](#installation). See [Usage](#usage) for a full example and the 33*dbb99499SAndroid Build Coastguard Worker[User Guide](docs/user_guide.md) for a more comprehensive feature overview. 34*dbb99499SAndroid Build Coastguard Worker 35*dbb99499SAndroid Build Coastguard WorkerIt may also help to read the [Google Test documentation](https://github.com/google/googletest/blob/main/docs/primer.md) 36*dbb99499SAndroid Build Coastguard Workeras some of the structural aspects of the APIs are similar. 37*dbb99499SAndroid Build Coastguard Worker 38*dbb99499SAndroid Build Coastguard Worker## Resources 39*dbb99499SAndroid Build Coastguard Worker 40*dbb99499SAndroid Build Coastguard Worker[Discussion group](https://groups.google.com/d/forum/benchmark-discuss) 41*dbb99499SAndroid Build Coastguard Worker 42*dbb99499SAndroid Build Coastguard WorkerIRC channels: 43*dbb99499SAndroid Build Coastguard Worker* [libera](https://libera.chat) #benchmark 44*dbb99499SAndroid Build Coastguard Worker 45*dbb99499SAndroid Build Coastguard Worker[Additional Tooling Documentation](docs/tools.md) 46*dbb99499SAndroid Build Coastguard Worker 47*dbb99499SAndroid Build Coastguard Worker[Assembly Testing Documentation](docs/AssemblyTests.md) 48*dbb99499SAndroid Build Coastguard Worker 49*dbb99499SAndroid Build Coastguard Worker[Building and installing Python bindings](docs/python_bindings.md) 50*dbb99499SAndroid Build Coastguard Worker 51*dbb99499SAndroid Build Coastguard Worker## Requirements 52*dbb99499SAndroid Build Coastguard Worker 53*dbb99499SAndroid Build Coastguard WorkerThe library can be used with C++03. However, it requires C++14 to build, 54*dbb99499SAndroid Build Coastguard Workerincluding compiler and standard library support. 55*dbb99499SAndroid Build Coastguard Worker 56*dbb99499SAndroid Build Coastguard Worker_See [dependencies.md](docs/dependencies.md) for more details regarding supported 57*dbb99499SAndroid Build Coastguard Workercompilers and standards._ 58*dbb99499SAndroid Build Coastguard Worker 59*dbb99499SAndroid Build Coastguard WorkerIf you have need for a particular compiler to be supported, patches are very welcome. 60*dbb99499SAndroid Build Coastguard Worker 61*dbb99499SAndroid Build Coastguard WorkerSee [Platform-Specific Build Instructions](docs/platform_specific_build_instructions.md). 62*dbb99499SAndroid Build Coastguard Worker 63*dbb99499SAndroid Build Coastguard Worker## Installation 64*dbb99499SAndroid Build Coastguard Worker 65*dbb99499SAndroid Build Coastguard WorkerThis describes the installation process using cmake. As pre-requisites, you'll 66*dbb99499SAndroid Build Coastguard Workerneed git and cmake installed. 67*dbb99499SAndroid Build Coastguard Worker 68*dbb99499SAndroid Build Coastguard Worker_See [dependencies.md](docs/dependencies.md) for more details regarding supported 69*dbb99499SAndroid Build Coastguard Workerversions of build tools._ 70*dbb99499SAndroid Build Coastguard Worker 71*dbb99499SAndroid Build Coastguard Worker```bash 72*dbb99499SAndroid Build Coastguard Worker# Check out the library. 73*dbb99499SAndroid Build Coastguard Worker$ git clone https://github.com/google/benchmark.git 74*dbb99499SAndroid Build Coastguard Worker# Go to the library root directory 75*dbb99499SAndroid Build Coastguard Worker$ cd benchmark 76*dbb99499SAndroid Build Coastguard Worker# Make a build directory to place the build output. 77*dbb99499SAndroid Build Coastguard Worker$ cmake -E make_directory "build" 78*dbb99499SAndroid Build Coastguard Worker# Generate build system files with cmake, and download any dependencies. 79*dbb99499SAndroid Build Coastguard Worker$ cmake -E chdir "build" cmake -DBENCHMARK_DOWNLOAD_DEPENDENCIES=on -DCMAKE_BUILD_TYPE=Release ../ 80*dbb99499SAndroid Build Coastguard Worker# or, starting with CMake 3.13, use a simpler form: 81*dbb99499SAndroid Build Coastguard Worker# cmake -DCMAKE_BUILD_TYPE=Release -S . -B "build" 82*dbb99499SAndroid Build Coastguard Worker# Build the library. 83*dbb99499SAndroid Build Coastguard Worker$ cmake --build "build" --config Release 84*dbb99499SAndroid Build Coastguard Worker``` 85*dbb99499SAndroid Build Coastguard WorkerThis builds the `benchmark` and `benchmark_main` libraries and tests. 86*dbb99499SAndroid Build Coastguard WorkerOn a unix system, the build directory should now look something like this: 87*dbb99499SAndroid Build Coastguard Worker 88*dbb99499SAndroid Build Coastguard Worker``` 89*dbb99499SAndroid Build Coastguard Worker/benchmark 90*dbb99499SAndroid Build Coastguard Worker /build 91*dbb99499SAndroid Build Coastguard Worker /src 92*dbb99499SAndroid Build Coastguard Worker /libbenchmark.a 93*dbb99499SAndroid Build Coastguard Worker /libbenchmark_main.a 94*dbb99499SAndroid Build Coastguard Worker /test 95*dbb99499SAndroid Build Coastguard Worker ... 96*dbb99499SAndroid Build Coastguard Worker``` 97*dbb99499SAndroid Build Coastguard Worker 98*dbb99499SAndroid Build Coastguard WorkerNext, you can run the tests to check the build. 99*dbb99499SAndroid Build Coastguard Worker 100*dbb99499SAndroid Build Coastguard Worker```bash 101*dbb99499SAndroid Build Coastguard Worker$ cmake -E chdir "build" ctest --build-config Release 102*dbb99499SAndroid Build Coastguard Worker``` 103*dbb99499SAndroid Build Coastguard Worker 104*dbb99499SAndroid Build Coastguard WorkerIf you want to install the library globally, also run: 105*dbb99499SAndroid Build Coastguard Worker 106*dbb99499SAndroid Build Coastguard Worker``` 107*dbb99499SAndroid Build Coastguard Workersudo cmake --build "build" --config Release --target install 108*dbb99499SAndroid Build Coastguard Worker``` 109*dbb99499SAndroid Build Coastguard Worker 110*dbb99499SAndroid Build Coastguard WorkerNote that Google Benchmark requires Google Test to build and run the tests. This 111*dbb99499SAndroid Build Coastguard Workerdependency can be provided two ways: 112*dbb99499SAndroid Build Coastguard Worker 113*dbb99499SAndroid Build Coastguard Worker* Checkout the Google Test sources into `benchmark/googletest`. 114*dbb99499SAndroid Build Coastguard Worker* Otherwise, if `-DBENCHMARK_DOWNLOAD_DEPENDENCIES=ON` is specified during 115*dbb99499SAndroid Build Coastguard Worker configuration as above, the library will automatically download and build 116*dbb99499SAndroid Build Coastguard Worker any required dependencies. 117*dbb99499SAndroid Build Coastguard Worker 118*dbb99499SAndroid Build Coastguard WorkerIf you do not wish to build and run the tests, add `-DBENCHMARK_ENABLE_GTEST_TESTS=OFF` 119*dbb99499SAndroid Build Coastguard Workerto `CMAKE_ARGS`. 120*dbb99499SAndroid Build Coastguard Worker 121*dbb99499SAndroid Build Coastguard Worker### Debug vs Release 122*dbb99499SAndroid Build Coastguard Worker 123*dbb99499SAndroid Build Coastguard WorkerBy default, benchmark builds as a debug library. You will see a warning in the 124*dbb99499SAndroid Build Coastguard Workeroutput when this is the case. To build it as a release library instead, add 125*dbb99499SAndroid Build Coastguard Worker`-DCMAKE_BUILD_TYPE=Release` when generating the build system files, as shown 126*dbb99499SAndroid Build Coastguard Workerabove. The use of `--config Release` in build commands is needed to properly 127*dbb99499SAndroid Build Coastguard Workersupport multi-configuration tools (like Visual Studio for example) and can be 128*dbb99499SAndroid Build Coastguard Workerskipped for other build systems (like Makefile). 129*dbb99499SAndroid Build Coastguard Worker 130*dbb99499SAndroid Build Coastguard WorkerTo enable link-time optimisation, also add `-DBENCHMARK_ENABLE_LTO=true` when 131*dbb99499SAndroid Build Coastguard Workergenerating the build system files. 132*dbb99499SAndroid Build Coastguard Worker 133*dbb99499SAndroid Build Coastguard WorkerIf you are using gcc, you might need to set `GCC_AR` and `GCC_RANLIB` cmake 134*dbb99499SAndroid Build Coastguard Workercache variables, if autodetection fails. 135*dbb99499SAndroid Build Coastguard Worker 136*dbb99499SAndroid Build Coastguard WorkerIf you are using clang, you may need to set `LLVMAR_EXECUTABLE`, 137*dbb99499SAndroid Build Coastguard Worker`LLVMNM_EXECUTABLE` and `LLVMRANLIB_EXECUTABLE` cmake cache variables. 138*dbb99499SAndroid Build Coastguard Worker 139*dbb99499SAndroid Build Coastguard WorkerTo enable sanitizer checks (eg., `asan` and `tsan`), add: 140*dbb99499SAndroid Build Coastguard Worker``` 141*dbb99499SAndroid Build Coastguard Worker -DCMAKE_C_FLAGS="-g -O2 -fno-omit-frame-pointer -fsanitize=address -fsanitize=thread -fno-sanitize-recover=all" 142*dbb99499SAndroid Build Coastguard Worker -DCMAKE_CXX_FLAGS="-g -O2 -fno-omit-frame-pointer -fsanitize=address -fsanitize=thread -fno-sanitize-recover=all " 143*dbb99499SAndroid Build Coastguard Worker``` 144*dbb99499SAndroid Build Coastguard Worker 145*dbb99499SAndroid Build Coastguard Worker### Stable and Experimental Library Versions 146*dbb99499SAndroid Build Coastguard Worker 147*dbb99499SAndroid Build Coastguard WorkerThe main branch contains the latest stable version of the benchmarking library; 148*dbb99499SAndroid Build Coastguard Workerthe API of which can be considered largely stable, with source breaking changes 149*dbb99499SAndroid Build Coastguard Workerbeing made only upon the release of a new major version. 150*dbb99499SAndroid Build Coastguard Worker 151*dbb99499SAndroid Build Coastguard WorkerNewer, experimental, features are implemented and tested on the 152*dbb99499SAndroid Build Coastguard Worker[`v2` branch](https://github.com/google/benchmark/tree/v2). Users who wish 153*dbb99499SAndroid Build Coastguard Workerto use, test, and provide feedback on the new features are encouraged to try 154*dbb99499SAndroid Build Coastguard Workerthis branch. However, this branch provides no stability guarantees and reserves 155*dbb99499SAndroid Build Coastguard Workerthe right to change and break the API at any time. 156*dbb99499SAndroid Build Coastguard Worker 157*dbb99499SAndroid Build Coastguard Worker## Usage 158*dbb99499SAndroid Build Coastguard Worker 159*dbb99499SAndroid Build Coastguard Worker### Basic usage 160*dbb99499SAndroid Build Coastguard Worker 161*dbb99499SAndroid Build Coastguard WorkerDefine a function that executes the code to measure, register it as a benchmark 162*dbb99499SAndroid Build Coastguard Workerfunction using the `BENCHMARK` macro, and ensure an appropriate `main` function 163*dbb99499SAndroid Build Coastguard Workeris available: 164*dbb99499SAndroid Build Coastguard Worker 165*dbb99499SAndroid Build Coastguard Worker```c++ 166*dbb99499SAndroid Build Coastguard Worker#include <benchmark/benchmark.h> 167*dbb99499SAndroid Build Coastguard Worker 168*dbb99499SAndroid Build Coastguard Workerstatic void BM_StringCreation(benchmark::State& state) { 169*dbb99499SAndroid Build Coastguard Worker for (auto _ : state) 170*dbb99499SAndroid Build Coastguard Worker std::string empty_string; 171*dbb99499SAndroid Build Coastguard Worker} 172*dbb99499SAndroid Build Coastguard Worker// Register the function as a benchmark 173*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_StringCreation); 174*dbb99499SAndroid Build Coastguard Worker 175*dbb99499SAndroid Build Coastguard Worker// Define another benchmark 176*dbb99499SAndroid Build Coastguard Workerstatic void BM_StringCopy(benchmark::State& state) { 177*dbb99499SAndroid Build Coastguard Worker std::string x = "hello"; 178*dbb99499SAndroid Build Coastguard Worker for (auto _ : state) 179*dbb99499SAndroid Build Coastguard Worker std::string copy(x); 180*dbb99499SAndroid Build Coastguard Worker} 181*dbb99499SAndroid Build Coastguard WorkerBENCHMARK(BM_StringCopy); 182*dbb99499SAndroid Build Coastguard Worker 183*dbb99499SAndroid Build Coastguard WorkerBENCHMARK_MAIN(); 184*dbb99499SAndroid Build Coastguard Worker``` 185*dbb99499SAndroid Build Coastguard Worker 186*dbb99499SAndroid Build Coastguard WorkerTo run the benchmark, compile and link against the `benchmark` library 187*dbb99499SAndroid Build Coastguard Worker(libbenchmark.a/.so). If you followed the build steps above, this library will 188*dbb99499SAndroid Build Coastguard Workerbe under the build directory you created. 189*dbb99499SAndroid Build Coastguard Worker 190*dbb99499SAndroid Build Coastguard Worker```bash 191*dbb99499SAndroid Build Coastguard Worker# Example on linux after running the build steps above. Assumes the 192*dbb99499SAndroid Build Coastguard Worker# `benchmark` and `build` directories are under the current directory. 193*dbb99499SAndroid Build Coastguard Worker$ g++ mybenchmark.cc -std=c++11 -isystem benchmark/include \ 194*dbb99499SAndroid Build Coastguard Worker -Lbenchmark/build/src -lbenchmark -lpthread -o mybenchmark 195*dbb99499SAndroid Build Coastguard Worker``` 196*dbb99499SAndroid Build Coastguard Worker 197*dbb99499SAndroid Build Coastguard WorkerAlternatively, link against the `benchmark_main` library and remove 198*dbb99499SAndroid Build Coastguard Worker`BENCHMARK_MAIN();` above to get the same behavior. 199*dbb99499SAndroid Build Coastguard Worker 200*dbb99499SAndroid Build Coastguard WorkerThe compiled executable will run all benchmarks by default. Pass the `--help` 201*dbb99499SAndroid Build Coastguard Workerflag for option information or see the [User Guide](docs/user_guide.md). 202*dbb99499SAndroid Build Coastguard Worker 203*dbb99499SAndroid Build Coastguard Worker### Usage with CMake 204*dbb99499SAndroid Build Coastguard Worker 205*dbb99499SAndroid Build Coastguard WorkerIf using CMake, it is recommended to link against the project-provided 206*dbb99499SAndroid Build Coastguard Worker`benchmark::benchmark` and `benchmark::benchmark_main` targets using 207*dbb99499SAndroid Build Coastguard Worker`target_link_libraries`. 208*dbb99499SAndroid Build Coastguard WorkerIt is possible to use ```find_package``` to import an installed version of the 209*dbb99499SAndroid Build Coastguard Workerlibrary. 210*dbb99499SAndroid Build Coastguard Worker```cmake 211*dbb99499SAndroid Build Coastguard Workerfind_package(benchmark REQUIRED) 212*dbb99499SAndroid Build Coastguard Worker``` 213*dbb99499SAndroid Build Coastguard WorkerAlternatively, ```add_subdirectory``` will incorporate the library directly in 214*dbb99499SAndroid Build Coastguard Workerto one's CMake project. 215*dbb99499SAndroid Build Coastguard Worker```cmake 216*dbb99499SAndroid Build Coastguard Workeradd_subdirectory(benchmark) 217*dbb99499SAndroid Build Coastguard Worker``` 218*dbb99499SAndroid Build Coastguard WorkerEither way, link to the library as follows. 219*dbb99499SAndroid Build Coastguard Worker```cmake 220*dbb99499SAndroid Build Coastguard Workertarget_link_libraries(MyTarget benchmark::benchmark) 221*dbb99499SAndroid Build Coastguard Worker``` 222