Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions benchmark/CDT.Benchmarks/Benchmarks.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Diagnosers;
using BenchmarkDotNet.Running;
using CDT;

Expand Down Expand Up @@ -59,6 +60,7 @@ public static (List<V2d<double>> Vertices, List<Edge> Edges) Read(string fileNam
/// ~2 600 constraint edges) – the same dataset used in the C++ CDT benchmarks.
/// </summary>
[MemoryDiagnoser]
[EventPipeProfiler(EventPipeProfile.CpuSampling)]
[GroupBenchmarksBy(BenchmarkLogicalGroupRule.ByCategory)]
[CategoriesColumn]
[ShortRunJob]
Expand Down Expand Up @@ -127,6 +129,16 @@ public Triangulation<double> Conforming_Auto()
return cdt;
}

[Benchmark(Description = "Conforming – AsProvided")]
[BenchmarkCategory("Conforming")]
public Triangulation<double> Conforming_AsProvided()
{
var cdt = new Triangulation<double>(VertexInsertionOrder.AsProvided);
cdt.InsertVertices(_vertices);
cdt.ConformToEdges(_edges);
return cdt;
}

// -- Full pipeline (insert + erase outer + holes) ------------------------

[Benchmark(Description = "Full pipeline – Auto")]
Expand All @@ -140,6 +152,30 @@ public Triangulation<double> FullPipeline_Auto()
cdt.EraseOuterTrianglesAndHoles();
return cdt;
}

// -- Finalization APIs (EraseSuperTriangle / EraseOuterTriangles) ---------

[Benchmark(Description = "EraseSuperTriangle – Auto")]
[BenchmarkCategory("Finalization")]
public Triangulation<double> EraseSuperTriangle_Auto()
{
var cdt = new Triangulation<double>(VertexInsertionOrder.Auto);
cdt.InsertVertices(_vertices);
cdt.InsertEdges(_edges);
cdt.EraseSuperTriangle();
return cdt;
}

[Benchmark(Description = "EraseOuterTriangles – Auto")]
[BenchmarkCategory("Finalization")]
public Triangulation<double> EraseOuterTriangles_Auto()
{
var cdt = new Triangulation<double>(VertexInsertionOrder.Auto);
cdt.InsertVertices(_vertices);
cdt.InsertEdges(_edges);
cdt.EraseOuterTriangles();
return cdt;
}
}

// ---------------------------------------------------------------------------
Expand All @@ -151,6 +187,7 @@ public Triangulation<double> FullPipeline_Auto()
/// to measure per-vertex overhead without the noise of large datasets.
/// </summary>
[MemoryDiagnoser]
[EventPipeProfiler(EventPipeProfile.CpuSampling)]
[GroupBenchmarksBy(BenchmarkLogicalGroupRule.ByCategory)]
[CategoriesColumn]
[ShortRunJob]
Expand Down Expand Up @@ -206,4 +243,37 @@ public Triangulation<float> FloatVsDouble_Float()
cdt.InsertEdges(ef);
return cdt;
}

[Benchmark(Description = "Small – Conforming Auto")]
[BenchmarkCategory("SmallConforming")]
public Triangulation<double> Small_Conforming_Auto()
{
var cdt = new Triangulation<double>(VertexInsertionOrder.Auto);
cdt.InsertVertices(_vertices);
cdt.ConformToEdges(_edges);
return cdt;
}

[Benchmark(Description = "Small – EraseSuperTriangle Auto")]
[BenchmarkCategory("SmallFinalization")]
public Triangulation<double> Small_EraseSuperTriangle_Auto()
{
var cdt = new Triangulation<double>(VertexInsertionOrder.Auto);
cdt.InsertVertices(_vertices);
cdt.InsertEdges(_edges);
cdt.EraseSuperTriangle();
return cdt;
}

[Benchmark(Description = "Small – EraseOuterTrianglesAndHoles Auto")]
[BenchmarkCategory("SmallFinalization")]
public Triangulation<double> Small_EraseOuterTrianglesAndHoles_Auto()
{
var cdt = new Triangulation<double>(VertexInsertionOrder.Auto,
IntersectingConstraintEdges.TryResolve, 0.0);
cdt.InsertVertices(_vertices);
cdt.InsertEdges(_edges);
cdt.EraseOuterTrianglesAndHoles();
return cdt;
}
}
8 changes: 5 additions & 3 deletions src/CDT.Core/KdTree.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,14 @@ public NearestTask(int node, T minX, T minY, T maxX, T maxY, SplitDir dir, T dis
private T _minX, _minY, _maxX, _maxY;
private bool _boxInitialized;
private int _size;
private readonly T _two;

private NearestTask[] _stack = new NearestTask[InitialStackDepth];

/// <summary>Initializes an empty KD-tree with no bounding box pre-set.</summary>
public KdTree()
{
_two = T.One + T.One;
_minX = T.MinValue; _minY = T.MinValue;
_maxX = T.MaxValue; _maxY = T.MaxValue;
_root = AddNewNode();
Expand All @@ -70,6 +72,7 @@ public KdTree()
/// <summary>Initializes an empty KD-tree with a known bounding box.</summary>
public KdTree(T minX, T minY, T maxX, T maxY)
{
_two = T.One + T.One;
_minX = minX; _minY = minY; _maxX = maxX; _maxY = maxY;
_root = AddNewNode();
_boxInitialized = true;
Expand Down Expand Up @@ -226,10 +229,9 @@ private static bool IsInsideBox(T px, T py, T minX, T minY, T maxX, T maxY)
=> px >= minX && px <= maxX && py >= minY && py <= maxY;

[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static T GetMid(T minX, T minY, T maxX, T maxY, SplitDir dir)
private T GetMid(T minX, T minY, T maxX, T maxY, SplitDir dir)
{
T two = T.One + T.One;
return dir == SplitDir.X ? (minX + maxX) / two : (minY + maxY) / two;
return dir == SplitDir.X ? (minX + maxX) / _two : (minY + maxY) / _two;
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
Expand Down
Loading