diff options
Diffstat (limited to 'bench')
-rw-r--r-- | bench/00-noop.cpp | 15 | ||||
-rw-r--r-- | bench/01-dijkstra.cpp | 67 | ||||
-rw-r--r-- | bench/CMakeLists.txt | 24 | ||||
-rw-r--r-- | bench/dummy.cc | 0 | ||||
-rw-r--r-- | bench/main.cpp | 57 |
5 files changed, 163 insertions, 0 deletions
diff --git a/bench/00-noop.cpp b/bench/00-noop.cpp new file mode 100644 index 00000000..ca84944a --- /dev/null +++ b/bench/00-noop.cpp @@ -0,0 +1,15 @@ +#include <benchmark/benchmark.h> + +#if 0 +namespace { + +void noop(benchmark::State& state) +{ + for (auto _ : state) + (void)0; +} + +BENCHMARK(noop); + +} // namespace +#endif diff --git a/bench/01-dijkstra.cpp b/bench/01-dijkstra.cpp new file mode 100644 index 00000000..b358f1f9 --- /dev/null +++ b/bench/01-dijkstra.cpp @@ -0,0 +1,67 @@ +#include "src/path-search.hpp" +#include "src/path-search-result.hpp" +#include "loader/loader.hpp" +#include <benchmark/benchmark.h> +#include <Corrade/Containers/Optional.h> +#include <Magnum/Math/Functions.h> + +namespace floormat { + +namespace { + +auto A = astar(); +bool first_run = true; + +void Dijkstra(benchmark::State& state) +{ + auto w = world(); + + constexpr auto wcx = 1, wcy = 1, wtx = 8, wty = 8, wox = 3, woy = 3; + constexpr auto max_dist = (uint32_t)(Vector2i(Math::abs(wcx)+1, Math::abs(wcy)+1)*TILE_MAX_DIM*iTILE_SIZE2).length(); + constexpr auto wch = chunk_coords_{wcx, wcy, 0}; + constexpr auto wt = local_coords{wtx, wty}; + constexpr auto wpos = global_coords{wch, wt}; + + auto& ch = w[chunk_coords_{0,0,0}]; + auto& ch2 = w[wch]; + auto metal2 = tile_image_proto{loader.tile_atlas("metal2", {2, 2}, pass_mode::blocked), 0}; + + for (int16_t j = wcy - 1; j <= wcy + 1; j++) + for (int16_t i = wcx - 1; i <= wcx + 1; i++) + { + auto &c = w[chunk_coords_{i, j, 0}]; + for (int k : { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, }) + { + c[{ k, k }].wall_north() = metal2; + c[{ k, k }].wall_west() = metal2; + } + } + + ch2[{ wtx, wty }].wall_west() = metal2; + ch2[{ wtx, wty }].wall_north() = metal2; + ch2[{ wtx+1, wty }].wall_west() = metal2; + ch2[{ wtx, wty -1}].wall_north() = metal2; + + fm_assert(ch.is_passability_modified()); + ch.ensure_passability(); + ch2.ensure_passability(); + + auto run = [&] { + A.Dijkstra(w, + {{0,0,0}, {11,9}}, // from + {wpos, {wox, woy}}, // to + 0, max_dist, {32,32}, // size + first_run ? 1 : 0); + }; + + run(); + first_run = false; + for (auto _ : state) + run(); +} + +} // namespace + +BENCHMARK(Dijkstra); + +} // namespace floormat diff --git a/bench/CMakeLists.txt b/bench/CMakeLists.txt new file mode 100644 index 00000000..ecce9dee --- /dev/null +++ b/bench/CMakeLists.txt @@ -0,0 +1,24 @@ +set(self floormat-benchmark) + +file(GLOB sources "*.cpp" CONFIGURE_ARGS) + +add_library(${self}_o OBJECT "${res}" "${sources}") +add_executable(${self} dummy.cc) + +target_link_libraries(${self}_o PUBLIC + ${floormat_headless-library} + Magnum::Magnum + Magnum::Trade + nlohmann_json::nlohmann_json + fmt::fmt + tsl::robin_map +) + +if(TARGET benchmark::benchmark) + target_link_libraries(${self}_o PUBLIC benchmark::benchmark) +else() + target_link_libraries(${self}_o PUBLIC benchmark) +endif() + +target_link_libraries(${self} PUBLIC ${self}_o floormat-serialize floormat-draw floormat) +install(TARGETS ${self} RUNTIME DESTINATION bin) diff --git a/bench/dummy.cc b/bench/dummy.cc new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/bench/dummy.cc diff --git a/bench/main.cpp b/bench/main.cpp new file mode 100644 index 00000000..80a491ec --- /dev/null +++ b/bench/main.cpp @@ -0,0 +1,57 @@ +#include "loader/loader.hpp" +#include "compat/headless.hpp" +#include <benchmark/benchmark.h> + +namespace floormat { + +namespace { + +#define main bench_main +int bench_main(int argc, char** argv); +BENCHMARK_MAIN(); +#undef main + +struct bench_app final : private FM_APPLICATION +{ + using Application = FM_APPLICATION; + explicit bench_app(int argc, char** argv); + + int exec() override; + ~bench_app(); + + int argc; + char** argv; +}; +bench_app::~bench_app() { loader_::destroy(); } + +int argc_ = 0; // NOLINT + +bench_app::bench_app(int argc, char** argv) : + Application { + {argc_, nullptr}, + Configuration{} + }, + argc{argc}, argv{argv} +{ +} + +int bench_app::exec() +{ + return bench_main(argc, argv); +} + +} // namespace + +} // namespace floormat + +using namespace floormat; + +int main(int argc, char** argv) +{ + int status; + { auto app = bench_app{argc, argv}; + status = app.exec(); + } + loader_::destroy(); + return status; +} |