This commit is contained in:
NukeBird 2025-04-28 12:01:47 +03:00
commit 6bd585af58
6 changed files with 163 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
.cache
build

13
CMakeLists.txt Normal file
View file

@ -0,0 +1,13 @@
cmake_minimum_required(VERSION 3.22.0)
project(intersection_bench)
set(CMAKE_CXX_FLAGS "-Wall -Wextra")
set(CMAKE_CXX_FLAGS_DEBUG "-g")
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
find_package(Catch2 REQUIRED)
add_executable(intersection_bench test.cpp)
target_link_libraries(intersection_bench PRIVATE Catch2::Catch2WithMain)

9
CMakeUserPresets.json Normal file
View file

@ -0,0 +1,9 @@
{
"version": 4,
"vendor": {
"conan": {}
},
"include": [
"build\\Release\\generators\\CMakePresets.json"
]
}

18
clang_profile Normal file
View file

@ -0,0 +1,18 @@
[settings]
os=Windows
arch=x86_64
build_type=Release
compiler=clang
compiler.version=19
compiler.cppstd=gnu20
compiler.runtime=static
compiler.runtime_type=Release
compiler.runtime_version=v143
[buildenv]
CC=clang
CXX=clang
RC=clang
[conf]
tools.cmake.cmaketoolchain:generator=Ninja

9
conanfile.txt Normal file
View file

@ -0,0 +1,9 @@
[requires]
catch2/3.8.0
[generators]
CMakeDeps
CMakeToolchain
[layout]
cmake_layout

112
test.cpp Normal file
View file

@ -0,0 +1,112 @@
#include <catch2/catch_test_macros.hpp>
#include <catch2/benchmark/catch_benchmark_all.hpp>
#include <cmath>
#include <random>
#define CATCH_CONFIG_MAIN
#include <catch2/catch_all.hpp>
struct Circle
{
float X;
float Y;
float R;
};
bool circle_circle_intersect(const Circle& a, const Circle& b)
{
auto dx = a.X - b.X;
auto dy = a.Y - b.Y;
auto distance = std::sqrt(dx*dx + dy*dy);
return distance < a.R + b.R;
}
bool circle_circle_intersect2(const Circle& a, const Circle& b)
{
auto dx = a.X - b.X;
auto dy = a.Y - b.Y;
auto r_sum = a.R + b.R;
return dx*dx + dy*dy < r_sum * r_sum;
}
std::random_device dev;
std::mt19937 rng(dev());
Circle generate_random_circle()
{
static std::uniform_real_distribution pos_dist(-100.0f, 100.0f);
static std::uniform_real_distribution r_dist(-10.0f, 10.0f);
return Circle
{
.X = pos_dist(rng),
.Y = pos_dist(rng),
.R = r_dist(rng)
};
}
TEST_CASE("Oh Hi Mark", "[test]")
{
BENCHMARK_ADVANCED("Circle circle (sqrt) [10000]")(
Catch::Benchmark::Chronometer meter)
{
std::vector<Circle> circles;
circles.reserve(10000);
for(int i = 0; i < 10000; ++i)
{
circles.emplace_back(generate_random_circle());
}
meter.measure(
[&]
{
int total = 0;
for(size_t i = 0; i < circles.size(); ++i)
{
const auto& a = circles[i];
for(size_t j = i + 1; j < circles.size(); ++j)
{
const auto& b = circles[j];
auto collision = circle_circle_intersect(a, b);
total += collision;
}
}
return total;
});
};
BENCHMARK_ADVANCED("Circle circle (no sqrt) [10000]")(
Catch::Benchmark::Chronometer meter)
{
std::vector<Circle> circles;
circles.reserve(10000);
for(int i = 0; i < 10000; ++i)
{
circles.emplace_back(generate_random_circle());
}
meter.measure(
[&]
{
int total = 0;
for(size_t i = 0; i < circles.size(); ++i)
{
const auto& a = circles[i];
for(size_t j = i + 1; j < circles.size(); ++j)
{
const auto& b = circles[j];
auto collision = circle_circle_intersect2(a, b);
total += collision;
}
}
return total;
});
};
}