测试
#include <benchmark/benchmark.h>
#include <set>
#include <stdlib.h>
void initStdSet(std::set<int> &container){
// std::set<int> bkt;
for(int i = 0; i != 10000; ++i){
container.emplace(rand());
}
}
// base
static void BM_CXXStdSetCreation(benchmark::State& state){
std::set<int> bkt;
initStdSet(bkt);
for(auto _ : state){
}
}
BENCHMARK(BM_CXXStdSetCreation);
// std::upper_bound with std::set
static void BM_CXXStdUpperBound(benchmark::State& state){
std::set<int> bkt;
initStdSet(bkt);
for(auto _ : state){
upper_bound(bkt.begin(), bkt.end(), 0);
}
}
BENCHMARK(BM_CXXStdUpperBound);
// std::set::upper_bound
static void BM_CXXStdSet_UpperBound(benchmark::State& state){
std::set<int> bkt;
initStdSet(bkt);
for(auto _ : state){
bkt.upper_bound(0);
}
}
BENCHMARK(BM_CXXStdSet_UpperBound);
BENCHMARK_MAIN();
Run on (2 X 2595.12 MHz CPU s)
CPU Caches:
L1 Data 32 KiB (x2)
L1 Instruction 32 KiB (x2)
L2 Unified 4096 KiB (x2)
L3 Unified 16384 KiB (x1)
Load Average: 0.80, 0.29, 0.13
------------------------------------------------------------------
Benchmark Time CPU Iterations
------------------------------------------------------------------
BM_CXXStdSetCreation 0.000 ns 0.000 ns 1000000000
BM_CXXStdUpperBound 208285 ns 208262 ns 3290
BM_CXXStdSet_UpperBound 7.87 ns 7.86 ns 82596575
差了足有两万倍的时间开销,因此遵循Effective STL item 45是十分必要的。
更多
cmake部署
# find_package(benchmark REQUIRED)
cmake_minimum_required(VERSION 3.16)
set(CXX_FLAGS
# -DCMAKE_BUILD_TYPE=Debug\Release
-g
# -DVALGRIND
-DCHECK_PTHREAD_RETURN_VALUE
-D_FILE_OFFSET_BITS=64
-Wall
-Wextra
-Werror
-Wconversion
-Wno-unused-parameter
-Wold-style-cast
-Woverloaded-virtual
-Wpointer-arith
-Wshadow
-Wwrite-strings
-march=native
# -MMD
-std=c++11
-rdynamic
)
if(CMAKE_BUILD_BITS EQUAL 32)
list(APPEND CXX_FLAGS "-m32")
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
list(APPEND CXX_FLAGS "-Wno-null-dereference")
list(APPEND CXX_FLAGS "-Wno-sign-conversion")
list(APPEND CXX_FLAGS "-Wno-unused-local-typedef")
list(APPEND CXX_FLAGS "-Wthread-safety")
list(REMOVE_ITEM CXX_FLAGS "-rdynamic")
endif()
project(test_benchmark)
# clang-tidy
# set(CMAKE_CXX_CLANG_TIDY
# clang-tidy;
# -header-filter=.;
# -checks=*;
# -warnings-as-errors=*;
# )
# google test
include(FetchContent)
FetchContent_Declare(
googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG release-1.12.1
)
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
# google/benchmark
add_subdirectory(benchmark)
add_executable(
test_exec main.cpp
)
target_link_libraries(test_exec benchmark::benchmark)
参考
Integrate Clang-Tidy into CMake
GoogleTest Quickstart with CMake
github: google/benchmark
github: chenshuo/muduo