From 5b94d919faaa7bf8175b4daebdce34ea17e2a145 Mon Sep 17 00:00:00 2001 From: AdityaPandeyCN Date: Thu, 4 Sep 2025 11:13:49 +0530 Subject: [PATCH 1/4] add sam to ram conversion benchmark Signed-off-by: AdityaPandeyCN --- benchmark/CMakeLists.txt | 20 ++++++-- benchmark/generate_sam_benchmark.cxx | 2 + benchmark/sam_to_ram_benchmark.cxx | 73 ++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 5 deletions(-) create mode 100644 benchmark/sam_to_ram_benchmark.cxx diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt index b6754e3..4ef7ef9 100644 --- a/benchmark/CMakeLists.txt +++ b/benchmark/CMakeLists.txt @@ -1,7 +1,7 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules) include(GoogleBenchmark) -add_library(sam_generator STATIC +add_library(sam_generator STATIC generate_sam_benchmark.cxx ) @@ -10,6 +10,7 @@ target_include_directories(sam_generator PUBLIC ) target_link_libraries(sam_generator PRIVATE benchmark::benchmark) +target_compile_definitions(sam_generator PRIVATE LIBRARY_BUILD) add_dependencies(sam_generator benchmark::benchmark) ROOT_EXECUTABLE(generate_sam_benchmark @@ -18,13 +19,22 @@ ROOT_EXECUTABLE(generate_sam_benchmark benchmark::benchmark ) -install(TARGETS generate_sam_benchmark +ROOT_EXECUTABLE(sam_to_ram_benchmark + sam_to_ram_benchmark.cxx + LIBRARIES + benchmark::benchmark + ramcore + sam_generator +) + +install(TARGETS generate_sam_benchmark sam_to_ram_benchmark RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) add_custom_target(benchmark - COMMAND generate_sam_benchmark - DEPENDS generate_sam_benchmark + COMMAND sam_to_ram_benchmark + DEPENDS sam_to_ram_benchmark WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - COMMENT "Running SAM generation benchmarks" + COMMENT "Running SAM to RAM conversion benchmark" ) + diff --git a/benchmark/generate_sam_benchmark.cxx b/benchmark/generate_sam_benchmark.cxx index 5550774..a2628f9 100644 --- a/benchmark/generate_sam_benchmark.cxx +++ b/benchmark/generate_sam_benchmark.cxx @@ -93,6 +93,7 @@ static void BM_GenerateSAM(benchmark::State& state) { num_reads * 200, benchmark::Counter::kIsRate); } +#ifndef LIBRARY_BUILD int main(int argc, char** argv) { for (int i = 1; i < argc; ++i) { if (std::string(argv[i]) == "--generate" && i + 1 < argc) { @@ -115,4 +116,5 @@ int main(int argc, char** argv) { ::benchmark::RunSpecifiedBenchmarks(); return 0; } +#endif diff --git a/benchmark/sam_to_ram_benchmark.cxx b/benchmark/sam_to_ram_benchmark.cxx new file mode 100644 index 0000000..763dbc0 --- /dev/null +++ b/benchmark/sam_to_ram_benchmark.cxx @@ -0,0 +1,73 @@ +#include +#include "generate_sam_benchmark.h" +#include "ramcore/SamToTTree.h" +#include "ramcore/SamToNTuple.h" +#include +#include +#include +#include + +static void BM_SamToRamComparison(benchmark::State& state) { + int num_reads = state.range(0); + + std::string sam_file = "benchmark_test.sam"; + std::string ttree_file = "benchmark_ttree.root"; + std::string rntuple_file = "benchmark_rntuple.root"; + + GenerateSAMFile(sam_file, num_reads); + + for (auto _ : state) { + + FILE* original_stdout = stdout; + stdout = fopen("/dev/null", "w"); + + samtoram(sam_file.c_str(), ttree_file.c_str(), + true, true, true, 1, 0); + + samtoramntuple(sam_file.c_str(), rntuple_file.c_str(), + true, true, true, 505, 0); + + fclose(stdout); + stdout = original_stdout; + + if (std::filesystem::exists(ttree_file)) { + auto ttree_size = std::filesystem::file_size(ttree_file); + state.counters["ttree_size_mb"] = ttree_size / (1024.0 * 1024.0); + } + + if (std::filesystem::exists(rntuple_file)) { + auto rntuple_size = std::filesystem::file_size(rntuple_file); + state.counters["rntuple_size_mb"] = rntuple_size / (1024.0 * 1024.0); + } + + if (state.counters["ttree_size_mb"] > 0 && state.counters["rntuple_size_mb"] > 0) { + state.counters["compression_ratio"] = + state.counters["ttree_size_mb"] / state.counters["rntuple_size_mb"]; + } + } + + std::remove(sam_file.c_str()); + std::remove(ttree_file.c_str()); + std::remove(rntuple_file.c_str()); + + state.counters["reads"] = num_reads; + state.counters["reads_per_second"] = benchmark::Counter( + num_reads, benchmark::Counter::kIsRate); +} + +int main(int argc, char** argv) { + std::cout << "SAM to RAM Conversion Benchmark" << std::endl; + std::cout << "Comparing TTree vs RNTuple performance and file sizes" << std::endl; + std::cout << std::endl; + + ::benchmark::RegisterBenchmark("BM_SamToRamComparison", BM_SamToRamComparison) + ->Args({1000}) + ->Args({10000}) + ->Args({100000}) + ->Unit(benchmark::kMillisecond); + + ::benchmark::Initialize(&argc, argv); + ::benchmark::RunSpecifiedBenchmarks(); + return 0; +} + From 3a9dcd09ba87d91de135c1884f1842dd245177a5 Mon Sep 17 00:00:00 2001 From: AdityaPandeyCN Date: Thu, 4 Sep 2025 11:28:48 +0530 Subject: [PATCH 2/4] clan-format changes Signed-off-by: AdityaPandeyCN --- benchmark/generate_sam_benchmark.cxx | 1 - benchmark/sam_to_ram_benchmark.cxx | 119 +++++++++++++-------------- 2 files changed, 58 insertions(+), 62 deletions(-) diff --git a/benchmark/generate_sam_benchmark.cxx b/benchmark/generate_sam_benchmark.cxx index a2628f9..3d20b93 100644 --- a/benchmark/generate_sam_benchmark.cxx +++ b/benchmark/generate_sam_benchmark.cxx @@ -117,4 +117,3 @@ int main(int argc, char** argv) { return 0; } #endif - diff --git a/benchmark/sam_to_ram_benchmark.cxx b/benchmark/sam_to_ram_benchmark.cxx index 763dbc0..00e2efb 100644 --- a/benchmark/sam_to_ram_benchmark.cxx +++ b/benchmark/sam_to_ram_benchmark.cxx @@ -7,67 +7,64 @@ #include #include -static void BM_SamToRamComparison(benchmark::State& state) { - int num_reads = state.range(0); - - std::string sam_file = "benchmark_test.sam"; - std::string ttree_file = "benchmark_ttree.root"; - std::string rntuple_file = "benchmark_rntuple.root"; - - GenerateSAMFile(sam_file, num_reads); - - for (auto _ : state) { - - FILE* original_stdout = stdout; - stdout = fopen("/dev/null", "w"); - - samtoram(sam_file.c_str(), ttree_file.c_str(), - true, true, true, 1, 0); - - samtoramntuple(sam_file.c_str(), rntuple_file.c_str(), - true, true, true, 505, 0); - - fclose(stdout); - stdout = original_stdout; - - if (std::filesystem::exists(ttree_file)) { - auto ttree_size = std::filesystem::file_size(ttree_file); - state.counters["ttree_size_mb"] = ttree_size / (1024.0 * 1024.0); - } - - if (std::filesystem::exists(rntuple_file)) { - auto rntuple_size = std::filesystem::file_size(rntuple_file); - state.counters["rntuple_size_mb"] = rntuple_size / (1024.0 * 1024.0); - } - - if (state.counters["ttree_size_mb"] > 0 && state.counters["rntuple_size_mb"] > 0) { - state.counters["compression_ratio"] = - state.counters["ttree_size_mb"] / state.counters["rntuple_size_mb"]; - } - } - - std::remove(sam_file.c_str()); - std::remove(ttree_file.c_str()); - std::remove(rntuple_file.c_str()); - - state.counters["reads"] = num_reads; - state.counters["reads_per_second"] = benchmark::Counter( - num_reads, benchmark::Counter::kIsRate); +static void BM_SamToRamComparison(benchmark::State &state) +{ + int num_reads = state.range(0); + + std::string sam_file = "benchmark_test.sam"; + std::string ttree_file = "benchmark_ttree.root"; + std::string rntuple_file = "benchmark_rntuple.root"; + + GenerateSAMFile(sam_file, num_reads); + + for (auto _ : state) { + + FILE *original_stdout = stdout; + stdout = fopen("/dev/null", "w"); + + samtoram(sam_file.c_str(), ttree_file.c_str(), true, true, true, 1, 0); + + samtoramntuple(sam_file.c_str(), rntuple_file.c_str(), true, true, true, 505, 0); + + fclose(stdout); + stdout = original_stdout; + + if (std::filesystem::exists(ttree_file)) { + auto ttree_size = std::filesystem::file_size(ttree_file); + state.counters["ttree_size_mb"] = ttree_size / (1024.0 * 1024.0); + } + + if (std::filesystem::exists(rntuple_file)) { + auto rntuple_size = std::filesystem::file_size(rntuple_file); + state.counters["rntuple_size_mb"] = rntuple_size / (1024.0 * 1024.0); + } + + if (state.counters["ttree_size_mb"] > 0 && state.counters["rntuple_size_mb"] > 0) { + state.counters["compression_ratio"] = state.counters["ttree_size_mb"] / state.counters["rntuple_size_mb"]; + } + } + + std::remove(sam_file.c_str()); + std::remove(ttree_file.c_str()); + std::remove(rntuple_file.c_str()); + + state.counters["reads"] = num_reads; + state.counters["reads_per_second"] = benchmark::Counter(num_reads, benchmark::Counter::kIsRate); } -int main(int argc, char** argv) { - std::cout << "SAM to RAM Conversion Benchmark" << std::endl; - std::cout << "Comparing TTree vs RNTuple performance and file sizes" << std::endl; - std::cout << std::endl; - - ::benchmark::RegisterBenchmark("BM_SamToRamComparison", BM_SamToRamComparison) - ->Args({1000}) - ->Args({10000}) - ->Args({100000}) - ->Unit(benchmark::kMillisecond); - - ::benchmark::Initialize(&argc, argv); - ::benchmark::RunSpecifiedBenchmarks(); - return 0; -} +int main(int argc, char **argv) +{ + std::cout << "SAM to RAM Conversion Benchmark" << std::endl; + std::cout << "Comparing TTree vs RNTuple performance and file sizes" << std::endl; + std::cout << std::endl; + + ::benchmark::RegisterBenchmark("BM_SamToRamComparison", BM_SamToRamComparison) + ->Args({1000}) + ->Args({10000}) + ->Args({100000}) + ->Unit(benchmark::kMillisecond); + ::benchmark::Initialize(&argc, argv); + ::benchmark::RunSpecifiedBenchmarks(); + return 0; +} From 241773d7758f917814c1277c87e13c00d46fab53 Mon Sep 17 00:00:00 2001 From: AdityaPandeyCN Date: Thu, 4 Sep 2025 13:30:59 +0530 Subject: [PATCH 3/4] removing main function Signed-off-by: AdityaPandeyCN --- .github/workflows/clang-tidy-review.yml | 3 ++- benchmark/CMakeLists.txt | 9 +-------- benchmark/generate_sam_benchmark.cxx | 24 ------------------------ 3 files changed, 3 insertions(+), 33 deletions(-) diff --git a/.github/workflows/clang-tidy-review.yml b/.github/workflows/clang-tidy-review.yml index 3b2048c..95db87a 100644 --- a/.github/workflows/clang-tidy-review.yml +++ b/.github/workflows/clang-tidy-review.yml @@ -50,6 +50,7 @@ jobs: split_workflow: true config_file: .clang-tidy cmake_command: > + bash -x -c ' source /opt/root/bin/thisroot.sh && cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER="$GITHUB_WORKSPACE/llvm/bin/clang" @@ -61,7 +62,7 @@ jobs: -DRAMTOOLS_BUILD_TOOLS=ON -DRAMTOOLS_BUILD_BENCHMARKS=ON && cd build && - cmake --build . --target googletest --parallel $(nproc --all) + cmake --build . --target googletest --parallel $(nproc --all) || true' - name: Upload artifacts if: always() diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt index 4ef7ef9..395ff44 100644 --- a/benchmark/CMakeLists.txt +++ b/benchmark/CMakeLists.txt @@ -10,15 +10,8 @@ target_include_directories(sam_generator PUBLIC ) target_link_libraries(sam_generator PRIVATE benchmark::benchmark) -target_compile_definitions(sam_generator PRIVATE LIBRARY_BUILD) add_dependencies(sam_generator benchmark::benchmark) -ROOT_EXECUTABLE(generate_sam_benchmark - generate_sam_benchmark.cxx - LIBRARIES - benchmark::benchmark -) - ROOT_EXECUTABLE(sam_to_ram_benchmark sam_to_ram_benchmark.cxx LIBRARIES @@ -27,7 +20,7 @@ ROOT_EXECUTABLE(sam_to_ram_benchmark sam_generator ) -install(TARGETS generate_sam_benchmark sam_to_ram_benchmark +install(TARGETS sam_to_ram_benchmark RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) diff --git a/benchmark/generate_sam_benchmark.cxx b/benchmark/generate_sam_benchmark.cxx index 3d20b93..e569fbd 100644 --- a/benchmark/generate_sam_benchmark.cxx +++ b/benchmark/generate_sam_benchmark.cxx @@ -93,27 +93,3 @@ static void BM_GenerateSAM(benchmark::State& state) { num_reads * 200, benchmark::Counter::kIsRate); } -#ifndef LIBRARY_BUILD -int main(int argc, char** argv) { - for (int i = 1; i < argc; ++i) { - if (std::string(argv[i]) == "--generate" && i + 1 < argc) { - std::string filename = argv[i + 1]; - int num_reads = (i + 2 < argc) ? std::stoi(argv[i + 2]) : BASE_SAM_READS; - GenerateSAMFile(filename, num_reads); - std::cout << "Generated SAM file: " << filename << " with " << num_reads << " reads" << std::endl; - return 0; - } - } - - std::cout << "Benchmarking SAM generation with a range of reads..." << std::endl; - - ::benchmark::RegisterBenchmark("BM_GenerateSAM", BM_GenerateSAM) - ->RangeMultiplier(10) - ->Range(100, 100000) - ->Unit(benchmark::kMicrosecond); - - ::benchmark::Initialize(&argc, argv); - ::benchmark::RunSpecifiedBenchmarks(); - return 0; -} -#endif From 7ffa0ab29772cc3d76198721a70b49dab86cad3f Mon Sep 17 00:00:00 2001 From: AdityaPandeyCN Date: Thu, 4 Sep 2025 13:39:13 +0530 Subject: [PATCH 4/4] clang format changes Signed-off-by: AdityaPandeyCN --- benchmark/generate_sam_benchmark.cxx | 1 - 1 file changed, 1 deletion(-) diff --git a/benchmark/generate_sam_benchmark.cxx b/benchmark/generate_sam_benchmark.cxx index e569fbd..ea6a28d 100644 --- a/benchmark/generate_sam_benchmark.cxx +++ b/benchmark/generate_sam_benchmark.cxx @@ -92,4 +92,3 @@ static void BM_GenerateSAM(benchmark::State& state) { state.counters["bytes_per_second"] = benchmark::Counter( num_reads * 200, benchmark::Counter::kIsRate); } -