From 2d0b6795662dceeaa7c887546fbbbfb44f1722b1 Mon Sep 17 00:00:00 2001 From: BrandonPacewic <92102436+BrandonPacewic@users.noreply.github.com> Date: Thu, 17 Apr 2025 13:11:37 -0700 Subject: [PATCH] feat(bench): automate running benchmarks --- Makefile | 4 ++++ benchmarks/CMakeLists.txt | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/Makefile b/Makefile index 4f41489..ca4cbc7 100644 --- a/Makefile +++ b/Makefile @@ -33,6 +33,9 @@ bench: BUILD_BENCH := ON bench: build @cmake --build "$(BUILD_DIR)" -j$(JOBS) +run-benchmarks: bench + @cmake --build "$(BUILD_DIR)" --target run_all_benchmarks -- -j$(JOBS) + tools: BUILD_TOOLS := ON tools: build @@ -50,6 +53,7 @@ help: @echo " build - configure and build" @echo " test - run ctest (RUN_TESTS=ON)" @echo " bench - build & run benchmarks (BUILD_BENCH=ON)" + @echo " run-benchmarks - run all benchmarks" @echo " tools - build project-defined tools (BUILD_TOOLS=ON)" @echo " format - run clang-format on all source files" @echo " clean - clean build artefacts" diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index 0c52676..f6fa953 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -39,6 +39,39 @@ foreach(BENCHMARK_FILE ${BENCHMARK_FILES}) add_executable(${FINAL_TARGET_NAME} ${BENCHMARK_FILE}) set_target_properties(${FINAL_TARGET_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${BENCHMARK_BINARY_DIR}) target_link_libraries(${FINAL_TARGET_NAME} PRIVATE cpl benchmark::benchmark) + + list(APPEND BENCHMARK_TARGETS ${FINAL_TARGET_NAME}) +endforeach() + +execute_process( + COMMAND git rev-parse --short HEAD + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + OUTPUT_VARIABLE GIT_HASH + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +string(TIMESTAMP TODAY "%Y-%m-%d_%H-%M-%S") +set(RESULT_DIR "${CMAKE_BINARY_DIR}/benchmarks/results") +file(MAKE_DIRECTORY "${RESULT_DIR}") +set(BENCH_JSONS "") + +foreach(TGT IN LISTS BENCHMARK_TARGETS) + set(JSON_OUT "${RESULT_DIR}/${TODAY}_${GIT_HASH}_${TGT}.json") + + add_custom_command( + OUTPUT "${JSON_OUT}" + COMMAND ${CMAKE_COMMAND} -E echo "→ running ${TGT}" + COMMAND $ + --benchmark_out=${JSON_OUT} + --benchmark_out_format=json + DEPENDS ${TGT} + COMMENT "Running benchmark '${TGT}' and writing ${JSON_OUT}" + VERBATIM + ) + + list(APPEND BENCH_JSONS "${JSON_OUT}") endforeach() +add_custom_target(run_all_benchmarks ALL DEPENDS ${BENCH_JSONS}) + include_directories(BEFORE ${CMAKE_SOURCE_DIR}/cpl/inc)