xref: /aosp_15_r20/external/google-benchmark/README.md (revision dbb99499c3810fa1611fa2242a2fc446be01a57c)
1*dbb99499SAndroid Build Coastguard Worker# Benchmark
2*dbb99499SAndroid Build Coastguard Worker
3*dbb99499SAndroid Build Coastguard Worker[![build-and-test](https://github.com/google/benchmark/workflows/build-and-test/badge.svg)](https://github.com/google/benchmark/actions?query=workflow%3Abuild-and-test)
4*dbb99499SAndroid Build Coastguard Worker[![bazel](https://github.com/google/benchmark/actions/workflows/bazel.yml/badge.svg)](https://github.com/google/benchmark/actions/workflows/bazel.yml)
5*dbb99499SAndroid Build Coastguard Worker[![pylint](https://github.com/google/benchmark/workflows/pylint/badge.svg)](https://github.com/google/benchmark/actions?query=workflow%3Apylint)
6*dbb99499SAndroid Build Coastguard Worker[![test-bindings](https://github.com/google/benchmark/workflows/test-bindings/badge.svg)](https://github.com/google/benchmark/actions?query=workflow%3Atest-bindings)
7*dbb99499SAndroid Build Coastguard Worker[![Coverage Status](https://coveralls.io/repos/google/benchmark/badge.svg)](https://coveralls.io/r/google/benchmark)
8*dbb99499SAndroid Build Coastguard Worker
9*dbb99499SAndroid Build Coastguard Worker[![Discord](https://discordapp.com/api/guilds/1125694995928719494/widget.png?style=shield)](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