Refine the User Guide CPU Frequency Scaling section (#1331) * Revert "Refine docs on changing cpufreq governor (#1325)" This reverts commit 9e859f5bf55073a2b4c785b97b9cb78cbdaf127e. * Refine the User Guide CPU Frequency Scaling section The text now describes the cpupower command, so users in a hurry have something to copy/paste that will likely work. It then suggests that there are probably more convenient optons available that people can look into. This reverts the prior commit, which introduced a shell script that doesn't work. It also retains the spirit of the original fix: no longer recommend setting the frequency governor to "powersave", which might not be appropriate or available. Note: I did attempt to write a bash script that set the govenor to "powersave" for the duration of a single command, but I gave up for many reasons: 1) it got complex, in part because the cpupower command does not seem to be designed for scripts (e.g. it prints out complex English phrases). 2) munging /proc/sys files directly feels unstable and less than universal. The libcpupower and cpupower are designed to abstract those away, because the details can vary. 3) there are better options. E.g. various GUI programs, and even Gnome's core Settings UI, let you adjust the system's performance mode without root access. Fixes #1325, #1327
A library to benchmark code snippets, similar to unit tests. Example:
#include <benchmark/benchmark.h> static void BM_SomeFunction(benchmark::State& state) { // Perform setup here for (auto _ : state) { // This code gets timed SomeFunction(); } } // Register the function as a benchmark BENCHMARK(BM_SomeFunction); // Run the benchmark BENCHMARK_MAIN();
To get started, see Requirements and Installation. See Usage for a full example and the User Guide for a more comprehensive feature overview.
It may also help to read the Google Test documentation as some of the structural aspects of the APIs are similar.
IRC channels:
Additional Tooling Documentation
Assembly Testing Documentation
The library can be used with C++03. However, it requires C++11 to build, including compiler and standard library support.
The following minimum versions are required to build the library:
See Platform-Specific Build Instructions.
This describes the installation process using cmake. As pre-requisites, you'll need git and cmake installed.
See dependencies.md for more details regarding supported versions of build tools.
# Check out the library. $ git clone https://github.com/google/benchmark.git # Go to the library root directory $ cd benchmark # Make a build directory to place the build output. $ cmake -E make_directory "build" # Generate build system files with cmake, and download any dependencies. $ cmake -E chdir "build" cmake -DBENCHMARK_DOWNLOAD_DEPENDENCIES=on -DCMAKE_BUILD_TYPE=Release ../ # or, starting with CMake 3.13, use a simpler form: # cmake -DCMAKE_BUILD_TYPE=Release -S . -B "build" # Build the library. $ cmake --build "build" --config Release
This builds the benchmark and benchmark_main libraries and tests. On a unix system, the build directory should now look something like this:
/benchmark
/build
/src
/libbenchmark.a
/libbenchmark_main.a
/test
...
Next, you can run the tests to check the build.
$ cmake -E chdir "build" ctest --build-config Release
If you want to install the library globally, also run:
sudo cmake --build "build" --config Release --target install
Note that Google Benchmark requires Google Test to build and run the tests. This dependency can be provided two ways:
benchmark/googletest.-DBENCHMARK_DOWNLOAD_DEPENDENCIES=ON is specified during configuration as above, the library will automatically download and build any required dependencies.If you do not wish to build and run the tests, add -DBENCHMARK_ENABLE_GTEST_TESTS=OFF to CMAKE_ARGS.
By default, benchmark builds as a debug library. You will see a warning in the output when this is the case. To build it as a release library instead, add -DCMAKE_BUILD_TYPE=Release when generating the build system files, as shown above. The use of --config Release in build commands is needed to properly support multi-configuration tools (like Visual Studio for example) and can be skipped for other build systems (like Makefile).
To enable link-time optimisation, also add -DBENCHMARK_ENABLE_LTO=true when generating the build system files.
If you are using gcc, you might need to set GCC_AR and GCC_RANLIB cmake cache variables, if autodetection fails.
If you are using clang, you may need to set LLVMAR_EXECUTABLE, LLVMNM_EXECUTABLE and LLVMRANLIB_EXECUTABLE cmake cache variables.
The main branch contains the latest stable version of the benchmarking library; the API of which can be considered largely stable, with source breaking changes being made only upon the release of a new major version.
Newer, experimental, features are implemented and tested on the v2 branch. Users who wish to use, test, and provide feedback on the new features are encouraged to try this branch. However, this branch provides no stability guarantees and reserves the right to change and break the API at any time.
Define a function that executes the code to measure, register it as a benchmark function using the BENCHMARK macro, and ensure an appropriate main function is available:
#include <benchmark/benchmark.h> static void BM_StringCreation(benchmark::State& state) { for (auto _ : state) std::string empty_string; } // Register the function as a benchmark BENCHMARK(BM_StringCreation); // Define another benchmark static void BM_StringCopy(benchmark::State& state) { std::string x = "hello"; for (auto _ : state) std::string copy(x); } BENCHMARK(BM_StringCopy); BENCHMARK_MAIN();
To run the benchmark, compile and link against the benchmark library (libbenchmark.a/.so). If you followed the build steps above, this library will be under the build directory you created.
# Example on linux after running the build steps above. Assumes the # `benchmark` and `build` directories are under the current directory. $ g++ mybenchmark.cc -std=c++11 -isystem benchmark/include \ -Lbenchmark/build/src -lbenchmark -lpthread -o mybenchmark
Alternatively, link against the benchmark_main library and remove BENCHMARK_MAIN(); above to get the same behavior.
The compiled executable will run all benchmarks by default. Pass the --help flag for option information or see the User Guide.
If using CMake, it is recommended to link against the project-provided benchmark::benchmark and benchmark::benchmark_main targets using target_link_libraries. It is possible to use find_package to import an installed version of the library.
find_package(benchmark REQUIRED)
Alternatively, add_subdirectory will incorporate the library directly in to one's CMake project.
add_subdirectory(benchmark)
Either way, link to the library as follows.
target_link_libraries(MyTarget benchmark::benchmark)