std::set::upper_bound与std::upper_bound性能差距有多大?

测试

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值