diff --git a/CMakeLists.txt b/CMakeLists.txt index 4782119..2919a3f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.25) +cmake_minimum_required(VERSION 3.24) project(leetcode) set(CMAKE_CXX_STANDARD 17) @@ -10,4 +10,9 @@ file(GLOB_RECURSE SOURCES "src/*/*.cpp") add_library(${APP_LIB_NAME} ${SOURCES}) include(cmake/googletest.cmake) +option(WITH_PROFILE ON) +if (${WITH_PROFILE}) + add_definitions(-DENABLE_PROFILING) + include(cmake/gperftools.cmake) +endif () include(cmake/tests.cmake) \ No newline at end of file diff --git a/cmake/googletest.cmake b/cmake/googletest.cmake index acfbff9..ced657b 100644 --- a/cmake/googletest.cmake +++ b/cmake/googletest.cmake @@ -1,9 +1,13 @@ +message(STATUS "======= GoogleTest start ... =======") + include(FetchContent) FetchContent_Declare( googletest URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip ) -# For Windows: Prevent overriding the parent project's compiler/linker settings + set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) FetchContent_MakeAvailable(googletest) -include(GoogleTest) \ No newline at end of file +include(GoogleTest) + +message(STATUS "======= GoogleTest end =======") \ No newline at end of file diff --git a/cmake/gperftools.cmake b/cmake/gperftools.cmake new file mode 100644 index 0000000..d369dc1 --- /dev/null +++ b/cmake/gperftools.cmake @@ -0,0 +1,42 @@ +message(STATUS "======= gperftools starting ... =======") +## 设置构建选项,如需要的话 +#set(tcmalloc_BUILD_STATIC ON CACHE BOOL "" FORCE) +#set(gperftools_enable_libunwind OFF CACHE BOOL "" FORCE) +#set(gperftools_enable_frame_pointers ON CACHE BOOL "" FORCE) +# +include(FetchContent) +FetchContent_Declare( + gperftools + GIT_REPOSITORY https://github.com/gperftools/gperftools.git + GIT_TAG gperftools-2.10 +# GIT_TAG master +) +FetchContent_GetProperties(gperftools) +if(NOT gperftools_POPULATED) + FetchContent_Populate(gperftools) +endif() + +set(GPERFTOOLS_SOURCE_DIR ${gperftools_SOURCE_DIR}) +set(GPERFTOOLS_INSTALL_DIR ${gperftools_BINARY_DIR}) + +execute_process( + COMMAND ${GPERFTOOLS_SOURCE_DIR}/autogen.sh + WORKING_DIRECTORY ${GPERFTOOLS_SOURCE_DIR} +) +execute_process( + COMMAND ${GPERFTOOLS_SOURCE_DIR}/configure --prefix=${GPERFTOOLS_INSTALL_DIR} + WORKING_DIRECTORY ${GPERFTOOLS_SOURCE_DIR} +) +execute_process( + COMMAND make -j6 + WORKING_DIRECTORY ${GPERFTOOLS_SOURCE_DIR} +) + +execute_process( + COMMAND make install + WORKING_DIRECTORY ${GPERFTOOLS_SOURCE_DIR} +) + +message(STATUS "============ gperftools source: ${gperftools_SOURCE_DIR}") +message(STATUS "============ gperftools binary: ${gperftools_BINARY_DIR}") +message(STATUS "======= gperftools end =======") diff --git a/cmake/tests.cmake b/cmake/tests.cmake index bbce010..90bd72c 100644 --- a/cmake/tests.cmake +++ b/cmake/tests.cmake @@ -1,9 +1,11 @@ set(APP_TEST_NAME leetcode_test) -message(STATUS =========== start testing APP_TEST_NAME: ${APP_TEST_NAME} ==========) +message(STATUS "=========== start testing APP_TEST_NAME: ${APP_TEST_NAME} ==========") set(TEST_SOURCES) file(GLOB_RECURSE TEST_SOURCES "tests/*.cpp") -message(STATUS =========== test_file: ${TEST_SOURCES} ==========) +message(STATUS "=========== test_file: ${TEST_SOURCES}") + +include(GoogleTest) enable_testing() add_executable( @@ -12,11 +14,29 @@ add_executable( ${TEST_SOURCES} ) target_link_libraries( - ${APP_TEST_NAME} + ${APP_TEST_NAME} PRIVATE GTest::gtest_main ${APP_LIB_NAME} ) -include(GoogleTest) +if(${WITH_PROFILE}) + message(STATUS "==== WITH_PROFILE: ON") + message(STATUS "==== gperftools_SOURCE_DIR: ${gperftools_SOURCE_DIR}/src") + # 设置gperftools的头文件路径 +# target_include_directories( +# ${APP_TEST_NAME} PRIVATE +# ${gperftools_SOURCE_DIR}/src +# ) + + include_directories(${gperftools_BINARY_DIR}/include) + + file(GLOB GPERFTOOLS_LIBRARIES "${gperftools_BINARY_DIR}/lib/*.a") + message("Found libraries:") + foreach(LIBRARY ${GPERFTOOLS_LIBRARIES}) + message(" ${LIBRARY}") + endforeach() + target_link_libraries(${APP_LIB_NAME} ${GPERFTOOLS_LIBRARIES}) +endif() + gtest_discover_tests(${APP_TEST_NAME}) message(STATUS "========= end testing ========") diff --git a/tests/test_main.cpp b/tests/test_main.cpp index 1da8654..638b7e6 100644 --- a/tests/test_main.cpp +++ b/tests/test_main.cpp @@ -1,6 +1,36 @@ #include +#ifdef ENABLE_PROFILING +#include "gperftools/profiler.h" +#include "gperftools/heap-profiler.h" +#endif -int main(int argc, char* argv[]) { - testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); +std::string get_timestamp() { + std::time_t now = std::time(nullptr); + std::tm timeInfo; + localtime_r(&now, &timeInfo); + + char buffer[64]; + std::strftime(buffer, sizeof(buffer), "./profile/feature_pipe_%Y%m%d", &timeInfo); + + return std::string(buffer); +} + +int main(int argc, char *argv[]) { + testing::InitGoogleTest(&argc, argv); + +#ifdef ENABLE_PROFILING + std::string prof_name = get_timestamp() + ".prof"; + std::string heap_name = get_timestamp() + ".heap"; + ProfilerStart(prof_name.c_str()); + HeapProfilerStart(heap_name.c_str()); +#endif + + int result = RUN_ALL_TESTS(); + +#ifdef ENABLE_PROFILING + ProfilerStop(); + HeapProfilerStop(); +#endif + + return result; } \ No newline at end of file