From ca47291f779fffd029400b6f2993036768218f4e Mon Sep 17 00:00:00 2001 From: David Allemang Date: Tue, 13 Sep 2022 23:49:04 -0400 Subject: [PATCH] Add benchmark tests --- tc/test/CMakeLists.txt | 12 ++++++++ tc/test/test_solve_speed.cpp | 58 ++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 tc/test/test_solve_speed.cpp diff --git a/tc/test/CMakeLists.txt b/tc/test/CMakeLists.txt index 8190659..2991628 100644 --- a/tc/test/CMakeLists.txt +++ b/tc/test/CMakeLists.txt @@ -26,3 +26,15 @@ add_simple_test(test_solve H) add_simple_test(test_solve I) add_simple_test(test_solve T) add_simple_test(test_solve X) + +set(MIN_DEBUG_CPS 300000) +set(MIN_RELEASE_CPS 700000) +add_executable(test_solve_speed test_solve_speed.cpp) +target_link_libraries(test_solve_speed PUBLIC tc) +target_compile_definitions(test_solve_speed PUBLIC MINIMUM_COS_PER_SEC=$,${MIN_DEBUG_CPS},${MIN_RELEASE_CPS}>) +add_simple_test(test_solve_speed B) +set_tests_properties(test_solve_speed_B PROPERTIES TIMEOUT 45) +add_simple_test(test_solve_speed E) +set_tests_properties(test_solve_speed_E PROPERTIES TIMEOUT 30) +add_simple_test(test_solve_speed T) +set_tests_properties(test_solve_speed_T PROPERTIES TIMEOUT 15) diff --git a/tc/test/test_solve_speed.cpp b/tc/test/test_solve_speed.cpp new file mode 100644 index 0000000..46eadd3 --- /dev/null +++ b/tc/test/test_solve_speed.cpp @@ -0,0 +1,58 @@ +#include +#include +#include + +#include +#include + +int main(int argc, char *argv[]) { + std::string key = argv[1]; + + std::cerr << "Min. cos/s: " << MINIMUM_COS_PER_SEC << std::endl; + std::vector, size_t>> groups; + + // See the group orders here https://en.wikipedia.org/wiki/Coxeter_group#Properties + if (key == "B") { + groups = { + {"B(7)", tc::group::B(7), {}, 645120}, + {"B(8)", tc::group::B(8), {}, 10321920}, + }; + } + if (key == "E") { + groups = { + {"E(6)", tc::group::E(6), {}, 51840}, + {"E(7)", tc::group::E(7), {}, 2903040}, + }; + } + if (key == "T") { + groups = { + {"T(500)", tc::group::T(500), {}, 1000000}, + {"T(1000)", tc::group::T(1000), {}, 4000000}, + }; + } + + int status = EXIT_SUCCESS; + + for (const auto &[name, group, sub_gens, expected]: groups) { + auto t0 = clock(); + auto cos = tc::solve(group, sub_gens); + auto t1 = clock(); + auto actual = cos.size(); + + auto sec = (double) (t1 - t0) / CLOCKS_PER_SEC; + auto cos_per_sec = (double) actual / sec; + + if (expected != actual) { + std::cerr << name << " wrong. " << actual << " (" << expected << ")" << std::endl; + status = EXIT_FAILURE; + } + + std::cout << name << " cos/s: " << (size_t) cos_per_sec << std::endl; + if (cos_per_sec < MINIMUM_COS_PER_SEC) { + std::cerr << name << " too slow." << std::endl; + status = EXIT_FAILURE; + } + } + + return status; +}