From 8f112b3500c88bb093993a30d298751e58ee8613 Mon Sep 17 00:00:00 2001 From: CmdrTMir Date: Mon, 30 Jun 2025 17:08:41 +0200 Subject: [PATCH 01/10] created exe for google benchmark --- CMakeLists.txt | 7 ++++ exe/g_bm.cc | 101 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 exe/g_bm.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 51684cca1..3c208491a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -134,3 +134,10 @@ add_executable(nigiri-test ${nigiri-test-files}) target_include_directories(nigiri-test PRIVATE include) target_link_libraries(nigiri-test nigiri gtest ianatzdb-res nigiri-generated) target_compile_options(nigiri-test PRIVATE ${nigiri-compile-options}) + +# --- GOOGLE BENCHMARK --- +find_package(benchmark REQUIRED) +file(GLOB_RECURSE nigiri-gbm-files exe/g_bm.cc) +add_executable(nigiri-gbm ${nigiri-gbm-files}) +target_link_libraries(nigiri-gbm PRIVATE nigiri boost-program_options ianatzdb-res benchmark::benchmark pthread) +target_compile_features(nigiri-gbm PUBLIC cxx_std_23) diff --git a/exe/g_bm.cc b/exe/g_bm.cc new file mode 100644 index 000000000..11c94c59e --- /dev/null +++ b/exe/g_bm.cc @@ -0,0 +1,101 @@ +#include + +#include "nigiri/query_generator/generator.h" +#include "nigiri/routing/raptor/raptor.h" +#include "nigiri/routing/raptor_search.h" +#include "nigiri/routing/search.h" + +void generate_queries( + std::vector& queries, + std::uint32_t n_queries, + nigiri::timetable const& tt, + nigiri::query_generation::generator_settings const& gs, + std::int64_t const seed) { + auto qg = nigiri::query_generation::generator{ + tt, gs, static_cast(seed)}; + queries.reserve(n_queries); + // std::cout << "--- Starting query generation ---\n"; + for (auto i = 0U; i != n_queries; ++i) { + auto const sdq = qg.random_query(); + if (sdq.has_value()) { + queries.emplace_back(sdq.value()); + } + } + // std::cout << "--- Finished query generation ---\n"; +} + +struct benchmark_result { + std::uint64_t q_idx_; + nigiri::routing::routing_result + routing_result_; + nigiri::pareto_set journeys_; + std::chrono::milliseconds total_time_; +}; + +void process_queries( + std::vector const& queries, + std::vector& results, + nigiri::timetable const& tt) { + results.reserve(queries.size()); + // std::cout << "--- Start processing queries ---\n"; + std::mutex mutex; + { + struct query_state { + nigiri::routing::search_state ss_; + nigiri::routing::raptor_state rs_; + }; + for (auto i = 0U; i < queries.size(); ++i) { + try { + query_state qs; + auto const total_time_start = std::chrono::steady_clock::now(); + auto const result = nigiri::routing::raptor_search( + tt, nullptr, qs.ss_, qs.rs_, queries[i].q_, + nigiri::direction::kForward); + auto const total_time_stop = std::chrono::steady_clock::now(); + auto const guard = std::lock_guard{mutex}; + results.emplace_back(benchmark_result{ + i, result, *result.journeys_, + std::chrono::duration_cast( + total_time_stop - total_time_start)}); + } catch (const std::exception& e) { + std::cout << e.what(); + } + } + } + // std::cout << "--- Finished processing queries ---\n"; +} + +// benchmark code: + +static void benchmark_random_queries(benchmark::State& state) { + std::vector results; + std::vector queries; + ::benchmark::DoNotOptimize(results); + ::benchmark::DoNotOptimize(queries); + for (auto _ : state) { + // erstmal so, ändern!! + std::filesystem::path tt_path = "/home/tmir/nigiri/build/tt.bin"; + auto tt = *nigiri::timetable::read(tt_path); + ::benchmark::DoNotOptimize(tt); + tt.resolve(); + ::benchmark::ClobberMemory(); + nigiri::query_generation::generator_settings gs; + ::benchmark::DoNotOptimize(gs); + generate_queries(queries, 10U, tt, gs, 22); + ::benchmark::ClobberMemory(); + process_queries(queries, results, tt); + ::benchmark::DoNotOptimize(results); + ::benchmark::DoNotOptimize(queries); + ::benchmark::DoNotOptimize(tt); + ::benchmark::DoNotOptimize(gs); + } +} +BENCHMARK(benchmark_random_queries)->Repetitions(4); + +// TODO: change ns to ms here +// TODO: take path to tt as argv +int main(int argc, char** argv) { + ::benchmark::MaybeReenterWithoutASLR(argc, argv); + ::benchmark::Initialize(&argc, argv); + ::benchmark::RunSpecifiedBenchmarks(); +} \ No newline at end of file From 4ee08588f148f0fe286e7225c60f2ad7a68647e7 Mon Sep 17 00:00:00 2001 From: CmdrTMir Date: Fri, 4 Jul 2025 15:18:03 +0200 Subject: [PATCH 02/10] path as argv --- exe/g_bm.cc | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/exe/g_bm.cc b/exe/g_bm.cc index 11c94c59e..a497250fc 100644 --- a/exe/g_bm.cc +++ b/exe/g_bm.cc @@ -5,6 +5,8 @@ #include "nigiri/routing/raptor_search.h" #include "nigiri/routing/search.h" +static std::filesystem::path tt_path; + void generate_queries( std::vector& queries, std::uint32_t n_queries, @@ -14,14 +16,12 @@ void generate_queries( auto qg = nigiri::query_generation::generator{ tt, gs, static_cast(seed)}; queries.reserve(n_queries); - // std::cout << "--- Starting query generation ---\n"; for (auto i = 0U; i != n_queries; ++i) { auto const sdq = qg.random_query(); if (sdq.has_value()) { queries.emplace_back(sdq.value()); } } - // std::cout << "--- Finished query generation ---\n"; } struct benchmark_result { @@ -37,7 +37,6 @@ void process_queries( std::vector& results, nigiri::timetable const& tt) { results.reserve(queries.size()); - // std::cout << "--- Start processing queries ---\n"; std::mutex mutex; { struct query_state { @@ -62,26 +61,22 @@ void process_queries( } } } - // std::cout << "--- Finished processing queries ---\n"; } // benchmark code: - static void benchmark_random_queries(benchmark::State& state) { std::vector results; std::vector queries; ::benchmark::DoNotOptimize(results); ::benchmark::DoNotOptimize(queries); for (auto _ : state) { - // erstmal so, ändern!! - std::filesystem::path tt_path = "/home/tmir/nigiri/build/tt.bin"; auto tt = *nigiri::timetable::read(tt_path); ::benchmark::DoNotOptimize(tt); tt.resolve(); ::benchmark::ClobberMemory(); nigiri::query_generation::generator_settings gs; ::benchmark::DoNotOptimize(gs); - generate_queries(queries, 10U, tt, gs, 22); + generate_queries(queries, 5U, tt, gs, 22); ::benchmark::ClobberMemory(); process_queries(queries, results, tt); ::benchmark::DoNotOptimize(results); @@ -90,12 +85,18 @@ static void benchmark_random_queries(benchmark::State& state) { ::benchmark::DoNotOptimize(gs); } } -BENCHMARK(benchmark_random_queries)->Repetitions(4); +BENCHMARK(benchmark_random_queries)->Repetitions(5); -// TODO: change ns to ms here -// TODO: take path to tt as argv int main(int argc, char** argv) { + std::string arg = (argc == 2) ? argv[1] : "error"; + if ("error" == arg) { + std::cout << "Bitte geben Sie den Pfad zum Timetable (tt.bin) an! \n"; + return -1; + } + tt_path = arg; + ::benchmark::SetDefaultTimeUnit(benchmark::kMicrosecond); ::benchmark::MaybeReenterWithoutASLR(argc, argv); ::benchmark::Initialize(&argc, argv); ::benchmark::RunSpecifiedBenchmarks(); + return 0; } \ No newline at end of file From 1f446d0d18d03256411135c5d45a1c96c5f962e6 Mon Sep 17 00:00:00 2001 From: CmdrTMir Date: Mon, 7 Jul 2025 18:59:36 +0200 Subject: [PATCH 03/10] wip bm exe --- exe/g_bm.cc | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/exe/g_bm.cc b/exe/g_bm.cc index a497250fc..b41fe0362 100644 --- a/exe/g_bm.cc +++ b/exe/g_bm.cc @@ -66,18 +66,17 @@ void process_queries( // benchmark code: static void benchmark_random_queries(benchmark::State& state) { std::vector results; - std::vector queries; ::benchmark::DoNotOptimize(results); + std::vector queries; ::benchmark::DoNotOptimize(queries); + auto tt = *nigiri::timetable::read(tt_path); + tt.resolve(); + ::benchmark::DoNotOptimize(tt); + nigiri::query_generation::generator_settings gs; + ::benchmark::DoNotOptimize(gs); + generate_queries(queries, 10U, tt, gs, 22); + for (auto _ : state) { - auto tt = *nigiri::timetable::read(tt_path); - ::benchmark::DoNotOptimize(tt); - tt.resolve(); - ::benchmark::ClobberMemory(); - nigiri::query_generation::generator_settings gs; - ::benchmark::DoNotOptimize(gs); - generate_queries(queries, 5U, tt, gs, 22); - ::benchmark::ClobberMemory(); process_queries(queries, results, tt); ::benchmark::DoNotOptimize(results); ::benchmark::DoNotOptimize(queries); From b6564bf0a3f059f09aa4e948b1498706ce98a84e Mon Sep 17 00:00:00 2001 From: CmdrTMir Date: Mon, 7 Jul 2025 20:42:24 +0200 Subject: [PATCH 04/10] delete comments --- exe/g_bm.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/exe/g_bm.cc b/exe/g_bm.cc index b41fe0362..972bc939c 100644 --- a/exe/g_bm.cc +++ b/exe/g_bm.cc @@ -63,7 +63,6 @@ void process_queries( } } -// benchmark code: static void benchmark_random_queries(benchmark::State& state) { std::vector results; ::benchmark::DoNotOptimize(results); @@ -87,7 +86,7 @@ static void benchmark_random_queries(benchmark::State& state) { BENCHMARK(benchmark_random_queries)->Repetitions(5); int main(int argc, char** argv) { - std::string arg = (argc == 2) ? argv[1] : "error"; + std::string arg = (argc > 1) ? argv[1] : "error"; if ("error" == arg) { std::cout << "Bitte geben Sie den Pfad zum Timetable (tt.bin) an! \n"; return -1; From 68b6114b5c8f6444935f783ad4efe6e54d3065f1 Mon Sep 17 00:00:00 2001 From: CmdrTMir Date: Mon, 14 Jul 2025 14:24:36 +0200 Subject: [PATCH 05/10] improve bm --- exe/g_bm.cc | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/exe/g_bm.cc b/exe/g_bm.cc index 972bc939c..01c524ce2 100644 --- a/exe/g_bm.cc +++ b/exe/g_bm.cc @@ -73,7 +73,7 @@ static void benchmark_random_queries(benchmark::State& state) { ::benchmark::DoNotOptimize(tt); nigiri::query_generation::generator_settings gs; ::benchmark::DoNotOptimize(gs); - generate_queries(queries, 10U, tt, gs, 22); + generate_queries(queries, 1U, tt, gs, 22); for (auto _ : state) { process_queries(queries, results, tt); @@ -83,16 +83,15 @@ static void benchmark_random_queries(benchmark::State& state) { ::benchmark::DoNotOptimize(gs); } } -BENCHMARK(benchmark_random_queries)->Repetitions(5); +BENCHMARK(benchmark_random_queries)->MinTime(20.0); int main(int argc, char** argv) { - std::string arg = (argc > 1) ? argv[1] : "error"; - if ("error" == arg) { - std::cout << "Bitte geben Sie den Pfad zum Timetable (tt.bin) an! \n"; - return -1; + if (argc <= 1) { + fmt::println("Usage: ./nigiri-gbm [TIMETABLE PATH]"); + return 1; } - tt_path = arg; - ::benchmark::SetDefaultTimeUnit(benchmark::kMicrosecond); + tt_path = argv[1]; + ::benchmark::SetDefaultTimeUnit(benchmark::kMillisecond); ::benchmark::MaybeReenterWithoutASLR(argc, argv); ::benchmark::Initialize(&argc, argv); ::benchmark::RunSpecifiedBenchmarks(); From ccb6d4d15e4f95bd0343e7134bc6926b9adf787f Mon Sep 17 00:00:00 2001 From: CmdrTMir Date: Mon, 14 Jul 2025 15:02:26 +0200 Subject: [PATCH 06/10] add benchmark to pkg --- .pkg | 4 ++++ .pkg.lock | 3 ++- CMakeLists.txt | 1 - 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.pkg b/.pkg index 67b285264..cea3d326b 100644 --- a/.pkg +++ b/.pkg @@ -1,3 +1,7 @@ +[benchmark] + url=git@github.com:motis-project/benchmark.git + branch=master + commit=94dc64692fa7e1feb361f5b6b3277fc982953afd [googletest] url=git@github.com:motis-project/googletest.git branch=master diff --git a/.pkg.lock b/.pkg.lock index 03f4c85ac..03e9fb80e 100644 --- a/.pkg.lock +++ b/.pkg.lock @@ -1,4 +1,4 @@ -11896755751842712608 +8112488944730267319 cista 1fb6f1d9bb8ac9fdb4ca648df69695dd819dc07e PEGTL 0d37dcf8f02c12a84fdf521973801a5baab78e8f res b759b93316afeb529b6cb5b2548b24c41e382fb0 @@ -8,6 +8,7 @@ docs 75dc89a53e9c2d78574fc0ffda698e69f1682ed2 fmt dc10f83be70ac2873d5f8d1ce317596f1fd318a2 utl 44ff7ba7e571b02c6c47d3981d722e187b86e576 oh d9eb908452e808179afeb7954e8beaa5b3626c36 +benchmark 94dc64692fa7e1feb361f5b6b3277fc982953afd zlib-ng 68ab3e2d80253ec5dc3c83691d9ff70477b32cd3 boost 73549ebca677fe6214202a1ab580362b4f80e653 doctest 832431f2d9dc77e51cc8b364337c186660bf267d diff --git a/CMakeLists.txt b/CMakeLists.txt index 3c208491a..ad6053adc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -136,7 +136,6 @@ target_link_libraries(nigiri-test nigiri gtest ianatzdb-res nigiri-generated) target_compile_options(nigiri-test PRIVATE ${nigiri-compile-options}) # --- GOOGLE BENCHMARK --- -find_package(benchmark REQUIRED) file(GLOB_RECURSE nigiri-gbm-files exe/g_bm.cc) add_executable(nigiri-gbm ${nigiri-gbm-files}) target_link_libraries(nigiri-gbm PRIVATE nigiri boost-program_options ianatzdb-res benchmark::benchmark pthread) From 810adb7a9f775763a8e65e99c92482841ef6be6c Mon Sep 17 00:00:00 2001 From: CmdrTMir Date: Mon, 14 Jul 2025 16:23:05 +0200 Subject: [PATCH 07/10] fix --- exe/g_bm.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/exe/g_bm.cc b/exe/g_bm.cc index 01c524ce2..c8f3b5d84 100644 --- a/exe/g_bm.cc +++ b/exe/g_bm.cc @@ -83,7 +83,9 @@ static void benchmark_random_queries(benchmark::State& state) { ::benchmark::DoNotOptimize(gs); } } -BENCHMARK(benchmark_random_queries)->MinTime(20.0); +BENCHMARK(benchmark_random_queries) + ->MinTime(20.0) + ->Unit(benchmark::kMillisecond); int main(int argc, char** argv) { if (argc <= 1) { @@ -91,8 +93,7 @@ int main(int argc, char** argv) { return 1; } tt_path = argv[1]; - ::benchmark::SetDefaultTimeUnit(benchmark::kMillisecond); - ::benchmark::MaybeReenterWithoutASLR(argc, argv); + //::benchmark::MaybeReenterWithoutASLR(argc, argv); ::benchmark::Initialize(&argc, argv); ::benchmark::RunSpecifiedBenchmarks(); return 0; From 9eab99878b8bd052f7a5fb1ac9630182e0ed9a1d Mon Sep 17 00:00:00 2001 From: CmdrTMir Date: Mon, 14 Jul 2025 16:27:58 +0200 Subject: [PATCH 08/10] delete comments --- exe/g_bm.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/exe/g_bm.cc b/exe/g_bm.cc index c8f3b5d84..d7ce94a54 100644 --- a/exe/g_bm.cc +++ b/exe/g_bm.cc @@ -93,7 +93,6 @@ int main(int argc, char** argv) { return 1; } tt_path = argv[1]; - //::benchmark::MaybeReenterWithoutASLR(argc, argv); ::benchmark::Initialize(&argc, argv); ::benchmark::RunSpecifiedBenchmarks(); return 0; From 641fb7b9afc8ad5911be265dbd9ddcda3d3ae356 Mon Sep 17 00:00:00 2001 From: CmdrTMir Date: Mon, 14 Jul 2025 16:34:08 +0200 Subject: [PATCH 09/10] formatting --- exe/g_bm.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exe/g_bm.cc b/exe/g_bm.cc index d7ce94a54..24689e131 100644 --- a/exe/g_bm.cc +++ b/exe/g_bm.cc @@ -56,7 +56,7 @@ void process_queries( i, result, *result.journeys_, std::chrono::duration_cast( total_time_stop - total_time_start)}); - } catch (const std::exception& e) { + } catch (std::exception const& e) { std::cout << e.what(); } } From eab43056f56f35f294606169654d8d6471b20432 Mon Sep 17 00:00:00 2001 From: CmdrTMir Date: Mon, 14 Jul 2025 16:40:34 +0200 Subject: [PATCH 10/10] formatting --- include/nigiri/logging.h | 2 +- src/loader/hrd/service/service.cc | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/include/nigiri/logging.h b/include/nigiri/logging.h index 67e28ee10..e8d8edfca 100644 --- a/include/nigiri/logging.h +++ b/include/nigiri/logging.h @@ -27,7 +27,7 @@ static log_lvl s_verbosity; inline std::string now() { using clock = std::chrono::system_clock; auto const now = clock::to_time_t(clock::now()); - struct tm tmp{}; + struct tm tmp {}; #if _MSC_VER >= 1400 gmtime_s(&tmp, &now); #else diff --git a/src/loader/hrd/service/service.cc b/src/loader/hrd/service/service.cc index ee5eb47e0..b329a0cf5 100644 --- a/src/loader/hrd/service/service.cc +++ b/src/loader/hrd/service/service.cc @@ -139,7 +139,7 @@ void parse_range(std::vector const& spec_lines, std::vector const& stops, std::vector& sections, service::section& begin_to_end, - TargetInformationType service::section::* member, + TargetInformationType service::section::*member, TargetInformationParserFun parse_target_info) { compute_ranges(spec_lines, stops, parse_info, [&](auto const& r) { TargetInformationType target_info = parse_target_info(r.first, r.second); @@ -156,14 +156,14 @@ void parse_range(std::vector const& spec_lines, } template -void parse_range(std::vector const& spec_lines, - range_parse_information const& parse_info, - std::vector const& stops, - std::vector& sections, - service::section& begin_to_end, - std::optional> - service::section::* member, - TargetInformationParserFun parse_target_info) { +void parse_range( + std::vector const& spec_lines, + range_parse_information const& parse_info, + std::vector const& stops, + std::vector& sections, + service::section& begin_to_end, + std::optional> service::section::*member, + TargetInformationParserFun parse_target_info) { compute_ranges(spec_lines, stops, parse_info, [&](auto const& r) { TargetInformationType target_info = parse_target_info(r.first, r.second);