From 013624c9bc654a314e04ea18e58f168b8be0c3ca Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sat, 14 Feb 2026 23:54:07 +0000 Subject: Refactor test-instancing so the data is generated in a common fixture Includes exposure of InstanceVertices::reserve because why not. --- gfx/gl/instanceVertices.h | 7 +++++-- test/perf-instancing.cpp | 38 +++++++++++++++++++++++--------------- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/gfx/gl/instanceVertices.h b/gfx/gl/instanceVertices.h index de20871..2417a91 100644 --- a/gfx/gl/instanceVertices.h +++ b/gfx/gl/instanceVertices.h @@ -48,13 +48,15 @@ public: } // NOLINTNEXTLINE)hicpp-explicit-conversions - [[nodiscard]] operator T &() + [[nodiscard]] + operator T &() { return instances->lookup(index); } // NOLINTNEXTLINE)hicpp-explicit-conversions - [[nodiscard]] operator const T &() const + [[nodiscard]] + operator const T &() const { return instances->lookup(index); } @@ -119,6 +121,7 @@ public: } using base::bufferName; + using base::reserve; [[nodiscard]] auto size() const diff --git a/test/perf-instancing.cpp b/test/perf-instancing.cpp index f3d16a8..4373e5a 100644 --- a/test/perf-instancing.cpp +++ b/test/perf-instancing.cpp @@ -9,30 +9,41 @@ namespace { glm::mat3 rot; }; - struct Data { - explicit Data(size_t n) + const TestMainWindowAppBase _; + + class Data : public benchmark::Fixture { + public: + void + SetUp(::benchmark::State & state) override { + auto count = static_cast(state.range()); std::mt19937 gen(std::random_device {}()); std::uniform_int_distribution xyDistrib(0, 1000000); std::uniform_int_distribution zDistrib(0, 10000); - while (n--) { + proxies.reserve(count); + instances.reserve(count); + + while (count--) { proxies.emplace_back(instances.acquire( GlobalPosition3D {xyDistrib(gen), xyDistrib(gen), zDistrib(gen)}, glm::mat3 {})); } } + void + TearDown(::benchmark::State &) override + { + proxies.clear(); + } + InstanceVertices instances; std::vector::InstanceProxy> proxies; }; - void - partition1(benchmark::State & state) + BENCHMARK_DEFINE_F(Data, partition1)(benchmark::State & state) { - TestMainWindowAppBase window; - Data data(static_cast(state.range())); GlobalPosition2D pos {}; for (auto loop : state) { - data.instances.partition([&pos](const auto & instance) { + instances.partition([&pos](const auto & instance) { return std::abs(instance.pos.x - pos.x) < 5 && std::abs(instance.pos.y - pos.y) < 5; }); pos += GlobalPosition2D {33, 17}; @@ -40,14 +51,11 @@ namespace { } } - void - partition2(benchmark::State & state) + BENCHMARK_DEFINE_F(Data, partition2)(benchmark::State & state) { - TestMainWindowAppBase window; - Data data(static_cast(state.range())); GlobalPosition2D pos {}; for (auto loop : state) { - data.instances.partition( + instances.partition( [&pos](const auto & instance) { return std::abs(instance.pos.x - pos.x) < 5; }, @@ -60,7 +68,7 @@ namespace { } } -BENCHMARK(partition1)->Range(0, 1 << 20); -BENCHMARK(partition2)->Range(0, 1 << 20); +BENCHMARK_REGISTER_F(Data, partition1)->Range(0, 1 << 20); +BENCHMARK_REGISTER_F(Data, partition2)->Range(0, 1 << 20); BENCHMARK_MAIN(); -- cgit v1.3