diff --git a/CMakeLists.txt b/CMakeLists.txt index c658277..2898aee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -120,3 +120,4 @@ add_library("Aaru.Checksums.Native" SHARED adler32.h adler32.c crc16.h crc16.c c crc16_neon.c) add_subdirectory(tests) +add_subdirectory(benchmarks) diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt new file mode 100644 index 0000000..2a17b78 --- /dev/null +++ b/benchmarks/CMakeLists.txt @@ -0,0 +1,23 @@ +cmake_minimum_required(VERSION 3.15) +project(benchmarks CXX) + +include(FetchContent) +FetchContent_Declare( + benchmark + GIT_REPOSITORY https://github.com/google/benchmark.git + GIT_TAG v1.8.4 +) +FetchContent_MakeAvailable(benchmark) + +add_executable(bench_spamsum bench_spamsum.cpp) +target_link_libraries(bench_spamsum PRIVATE benchmark::benchmark "Aaru.Checksums.Native") +target_include_directories(bench_spamsum PRIVATE ${CMAKE_SOURCE_DIR}) + +# Copy DLL to benchmark output directory after build (Windows) +if (WIN32) + add_custom_command(TARGET bench_spamsum POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "$/$" + $ + ) +endif() diff --git a/benchmarks/bench_spamsum.cpp b/benchmarks/bench_spamsum.cpp new file mode 100644 index 0000000..167a484 --- /dev/null +++ b/benchmarks/bench_spamsum.cpp @@ -0,0 +1,29 @@ +#include +#include "library.h" +#include "spamsum.h" +#include +#include +#include + +#define TEST_DATA_SIZE (1024 * 1024) + +static void BM_spamsum_update(benchmark::State& state) { + spamsum_ctx *ctx = spamsum_init(); + uint8_t *data = (uint8_t*)malloc(TEST_DATA_SIZE); + // Fill buffer with random data + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution dis(0, 255); + for (size_t i = 0; i < TEST_DATA_SIZE; ++i) { + data[i] = static_cast(dis(gen)); + } + for (auto _ : state) { + spamsum_update(ctx, data, TEST_DATA_SIZE); + } + free(data); + spamsum_free(ctx); +} + +BENCHMARK(BM_spamsum_update)->MinTime(5.0)->Unit(benchmark::kMillisecond); + +BENCHMARK_MAIN();