#include #include #include #include #include "positional_container.hpp" // TODO: Add necessary includes for collision testing // #include "collision_shapes.hpp" // #include "entities.hpp" /** * @file collision_performance.cpp * @brief Performance tests for collision detection systems * * This file contains performance benchmarks and tests for various * collision detection algorithms and optimizations. */ /** * @brief Helper class to measure and print execution time */ class PerformanceTimer { public: using Clock = std::chrono::high_resolution_clock; using TimePoint = std::chrono::time_point; using Duration = std::chrono::duration; PerformanceTimer(const std::string& name) : name_(name) { start_ = Clock::now(); } ~PerformanceTimer() { auto end = Clock::now(); Duration duration = end - start_; std::cout << std::fixed << std::setprecision(3) << "[PERF] " << name_ << ": " << duration.count() << " ms" << std::endl; } double elapsed_ms() const { auto end = Clock::now(); Duration duration = end - start_; return duration.count(); } private: std::string name_; TimePoint start_; }; /** * @brief Run a function multiple times and measure average execution time * @param name Name of the test for output * @param iterations Number of iterations to run * @param func Function to benchmark */ template void benchmark_function(const std::string& name, int iterations, Func func) { auto start = PerformanceTimer::Clock::now(); for (int i = 0; i < iterations; ++i) { func(); } auto end = PerformanceTimer::Clock::now(); PerformanceTimer::Duration total_duration = end - start; double avg_duration = total_duration.count() / iterations; std::cout << std::fixed << std::setprecision(6) << "[BENCHMARK] " << name << ":\n" << " Total: " << total_duration.count() << " ms\n" << " Iterations: " << iterations << "\n" << " Average: " << avg_duration << " ms\n" << " Throughput: " << (iterations / (total_duration.count() / 1000.0)) << " ops/sec" << std::endl; } /** * @brief Simple dummy class that conforms to HasPosition concept * Used for testing PositionalContainer without heavy dependencies */ class Dummy { public: Dummy() : m_Position(0.0f, 0.0f) {} Dummy(float x, float y) : m_Position(x, y) {} Dummy(WorldPos pos) : m_Position(pos) {} WorldPos GetPosition() const { return m_Position; } void SetPosition(WorldPos pos) { m_Position = pos; } private: WorldPos m_Position; }; // Example test function 1 void test_function_1() { PositionalContainer pos_cont{WorldSize{10.0f, 10.0f}, 10}; SimpleContainer simp_cont; // TODO: Implement actual collision test volatile int sum = 0; for (int i = 0; i < 1000; ++i) { sum += i; } } // Example test function 2 void test_function_2() { // TODO: Implement actual collision test volatile int product = 1; for (int i = 1; i < 100; ++i) { product *= (i % 10 + 1); } } TEST(CollisionPerformance, CompareAlgorithms) { std::cout << "\n=== Collision Performance Comparison ===\n" << std::endl; const int iterations = 10000; benchmark_function("Algorithm 1 (test_function_1)", iterations, test_function_1); benchmark_function("Algorithm 2 (test_function_2)", iterations, test_function_2); std::cout << "\n======================================\n" << std::endl; SUCCEED(); }