diff options
author | Eric Fiselier <eric@efcs.ca> | 2016-10-30 22:53:00 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2016-10-30 22:53:00 +0000 |
commit | 2d2f0c0af37aaebeece1cdd37160f07d573ac6b8 (patch) | |
tree | 2e36edf25222bcf35f026746986ad3fb8df7240e /benchmarks | |
parent | ff8cce45f416204451eb88136eba383dd48753b9 (diff) |
Add start of filesystem benchmarks
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@285524 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'benchmarks')
-rw-r--r-- | benchmarks/CMakeLists.txt | 30 | ||||
-rw-r--r-- | benchmarks/GenerateInput.hpp | 2 | ||||
-rw-r--r-- | benchmarks/filesystem.bench.cpp | 90 |
3 files changed, 118 insertions, 4 deletions
diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index 4160157da..ed562e0cc 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -37,7 +37,14 @@ ExternalProject_Add(google-benchmark-libcxx #============================================================================== # Build Google Benchmark for the native stdlib #============================================================================== -if (LIBCXX_BUILD_BENCHMARK_NATIVE_STDLIB) +set(BENCHMARK_NATIVE_TARGET_FLAGS) +if (LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN) + set(BENCHMARK_NATIVE_TARGET_FLAGS + -gcc-toolchain ${LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN}) +endif() +split_list(BENCHMARK_NATIVE_TARGET_FLAGS) + +if (LIBCXX_BENCHMARK_NATIVE_STDLIB) ExternalProject_Add(google-benchmark-native EXCLUDE_FROM_ALL ON PREFIX benchmark-native @@ -46,6 +53,7 @@ if (LIBCXX_BUILD_BENCHMARK_NATIVE_STDLIB) CMAKE_CACHE_ARGS -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER} -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER} + -DCMAKE_CXX_FLAGS:STRING=${BENCHMARK_NATIVE_TARGET_FLAGS} -DCMAKE_BUILD_TYPE:STRING=RELEASE -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -DBENCHMARK_ENABLE_TESTING:BOOL=OFF) @@ -72,12 +80,18 @@ set(BENCHMARK_TEST_LIBCXX_LINK_FLAGS -nodefaultlibs -L${BENCHMARK_LIBCXX_INSTALL}/lib/ ) +set(BENCHMARK_TEST_NATIVE_COMPILE_FLAGS + ${BENCHMARK_NATIVE_TARGET_FLAGS} + ${BENCHMARK_TEST_COMPILE_FLAGS} +) set(BENCHMARK_TEST_NATIVE_LINK_FLAGS - -L${BENCHMARK_NATIVE_INSTALL}/lib/ + ${BENCHMARK_NATIVE_TARGET_FLAGS} + -L${BENCHMARK_NATIVE_INSTALL}/lib ) split_list(BENCHMARK_TEST_COMPILE_FLAGS) split_list(BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS) split_list(BENCHMARK_TEST_LIBCXX_LINK_FLAGS) +split_list(BENCHMARK_TEST_NATIVE_COMPILE_FLAGS) split_list(BENCHMARK_TEST_NATIVE_LINK_FLAGS) macro(add_benchmark_test name source_file) set(libcxx_target ${name}_libcxx) @@ -89,17 +103,25 @@ macro(add_benchmark_test name source_file) else() target_link_libraries(${libcxx_target} cxx_static) endif() + if (TARGET cxx_experimental) + target_link_libraries(${libcxx_target} cxx_experimental) + endif() target_link_libraries(${libcxx_target} -lbenchmark) set_target_properties(${libcxx_target} PROPERTIES OUTPUT_NAME "${name}.libcxx.out" COMPILE_FLAGS "${BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS}" LINK_FLAGS "${BENCHMARK_TEST_LIBCXX_LINK_FLAGS}") - if (LIBCXX_BUILD_BENCHMARK_NATIVE_STDLIB) + if (LIBCXX_BENCHMARK_NATIVE_STDLIB) set(native_target ${name}_native) add_executable(${native_target} EXCLUDE_FROM_ALL ${source_file}) add_dependencies(${native_target} google-benchmark-native) target_link_libraries(${native_target} -lbenchmark) + if (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++") + target_link_libraries(${native_target} -lstdc++fs) + elseif (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libc++") + target_link_libraries(${native_target} -lc++experimental) + endif() if (LIBCXX_HAS_PTHREAD_LIB) target_link_libraries(${native_target} -pthread) endif() @@ -108,7 +130,7 @@ macro(add_benchmark_test name source_file) PROPERTIES OUTPUT_NAME "${name}.native.out" INCLUDE_DIRECTORIES "" - COMPILE_FLAGS "${BENCHMARK_TEST_COMPILE_FLAGS}" + COMPILE_FLAGS "${BENCHMARK_TEST_NATIVE_COMPILE_FLAGS}" LINK_FLAGS "${BENCHMARK_TEST_NATIVE_LINK_FLAGS}") endif() endmacro() diff --git a/benchmarks/GenerateInput.hpp b/benchmarks/GenerateInput.hpp index affd54125..9d5adac4a 100644 --- a/benchmarks/GenerateInput.hpp +++ b/benchmarks/GenerateInput.hpp @@ -137,4 +137,6 @@ inline std::vector<const char*> getRandomCStringInputs(size_t N) { cinputs.push_back(str.c_str()); return cinputs; } + + #endif // BENCHMARK_GENERATE_INPUT_HPP diff --git a/benchmarks/filesystem.bench.cpp b/benchmarks/filesystem.bench.cpp new file mode 100644 index 000000000..8dacbe664 --- /dev/null +++ b/benchmarks/filesystem.bench.cpp @@ -0,0 +1,90 @@ +#include <experimental/filesystem> + +#include "benchmark/benchmark_api.h" +#include "GenerateInput.hpp" + +namespace fs = std::experimental::filesystem; + +static const size_t TestNumInputs = 1024; + + +template <class GenInputs> +void BM_PathConstructString(benchmark::State &st, GenInputs gen) { + using namespace fs; + const auto in = gen(st.range(0)); + path PP; + for (auto& Part : in) + PP /= Part; + benchmark::DoNotOptimize(PP.native().data()); + while (st.KeepRunning()) { + const path P(PP.native()); + benchmark::DoNotOptimize(P.native().data()); + } +} +BENCHMARK_CAPTURE(BM_PathConstructString, iterate_elements, + getRandomStringInputs)->Arg(TestNumInputs); + + +template <class GenInputs> +void BM_PathIterateMultipleTimes(benchmark::State &st, GenInputs gen) { + using namespace fs; + const auto in = gen(st.range(0)); + path PP; + for (auto& Part : in) + PP /= Part; + benchmark::DoNotOptimize(PP.native().data()); + while (st.KeepRunning()) { + for (auto &E : PP) { + benchmark::DoNotOptimize(E.native().data()); + } + benchmark::ClobberMemory(); + } +} +BENCHMARK_CAPTURE(BM_PathIterateMultipleTimes, iterate_elements, + getRandomStringInputs)->Arg(TestNumInputs); + + +template <class GenInputs> +void BM_PathIterateOnce(benchmark::State &st, GenInputs gen) { + using namespace fs; + const auto in = gen(st.range(0)); + path PP; + for (auto& Part : in) + PP /= Part; + benchmark::DoNotOptimize(PP.native().data()); + while (st.KeepRunning()) { + const path P = PP.native(); + for (auto &E : P) { + benchmark::DoNotOptimize(E.native().data()); + } + benchmark::ClobberMemory(); + } +} +BENCHMARK_CAPTURE(BM_PathIterateOnce, iterate_elements, + getRandomStringInputs)->Arg(TestNumInputs); + +template <class GenInputs> +void BM_PathIterateOnceBackwards(benchmark::State &st, GenInputs gen) { + using namespace fs; + const auto in = gen(st.range(0)); + path PP; + for (auto& Part : in) + PP /= Part; + benchmark::DoNotOptimize(PP.native().data()); + while (st.KeepRunning()) { + const path P = PP.native(); + const auto B = P.begin(); + auto I = P.end(); + while (I != B) { + --I; + benchmark::DoNotOptimize(*I); + } + benchmark::DoNotOptimize(*I); + } +} +BENCHMARK_CAPTURE(BM_PathIterateOnceBackwards, iterate_elements, + getRandomStringInputs)->Arg(TestNumInputs); + + + +BENCHMARK_MAIN() |