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. --- test/perf-instancing.cpp | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) (limited to 'test/perf-instancing.cpp') 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