This file contains performance benchmarks and analysis for the delaunay library. The results are automatically generated and updated by the benchmark infrastructure.
- Last Updated: 2026-05-21 21:04:39 UTC
- Generated By: benchmark_utils.py
- Git Commit: 3456ca96abeeee5efb2ef413c3eb91d57f3921b4
- Hardware: Apple M4 Max (16 cores)
- Memory: 64.0 GB
- OS: macOS
- Rust: rustc 1.95.0 (59807616e 2026-04-14)
- Date: 2026-05-21 21:01:27 UTC
- Git commit: 3456ca96abeeee5efb2ef413c3eb91d57f3921b4
- Source: current
target/criterionconstruction results
| Benchmark ID | Vertices | Time (mean) | Throughput (mean) | Simplices Generated |
|---|---|---|---|---|
tds_new_2d/tds_new/4000 |
4000 | 1154.959 ms | 3.463 Kelem/s | 7,974 |
tds_new_2d/tds_new_adversarial/4000 |
4000 | 1318.191 ms | 3.034 Kelem/s | 7,971 |
| Benchmark ID | Vertices | Time (mean) | Throughput (mean) | Simplices Generated |
|---|---|---|---|---|
tds_new_3d/tds_new/750 |
750 | 884.208 ms | 0.848 Kelem/s | 4,663 |
tds_new_3d/tds_new_adversarial/750 |
750 | 1123.063 ms | 0.668 Kelem/s | 4,726 |
| Benchmark ID | Vertices | Time (mean) | Throughput (mean) | Simplices Generated |
|---|---|---|---|---|
tds_new_4d/tds_new/75 |
75 | 901.804 ms | 0.083 Kelem/s | 1,105 |
tds_new_4d/tds_new_adversarial/75 |
75 | 953.070 ms | 0.079 Kelem/s | 1,129 |
| Benchmark ID | Vertices | Time (mean) | Throughput (mean) | Simplices Generated |
|---|---|---|---|---|
tds_new_5d/tds_new/25 |
25 | 997.657 ms | 0.025 Kelem/s | 421 |
tds_new_5d/tds_new_adversarial/25 |
25 | 871.978 ms | 0.029 Kelem/s | 410 |
This suite is the versioned benchmark contract for public Delaunay workflows. It covers construction, hull extraction, validation, incremental insertion, boundary traversal, and explicit bistellar flip roundtrips.
Public API: DelaunayTriangulation::new_with_options
| Benchmark ID | Dimension | Input | Variant | Mean | 95% CI |
|---|---|---|---|---|---|
tds_new_2d/tds_new/4000 |
2D | 4000 | well-conditioned | 1.155 s | 1.154 s - 1.156 s |
tds_new_2d/tds_new_adversarial/4000 |
2D | 4000 | adversarial | 1.318 s | 1.314 s - 1.325 s |
tds_new_3d/tds_new/750 |
3D | 750 | well-conditioned | 884.208 ms | 882.600 ms - 886.255 ms |
tds_new_3d/tds_new_adversarial/750 |
3D | 750 | adversarial | 1.123 s | 1.121 s - 1.125 s |
tds_new_4d/tds_new/75 |
4D | 75 | well-conditioned | 901.804 ms | 889.885 ms - 916.534 ms |
tds_new_4d/tds_new_adversarial/75 |
4D | 75 | adversarial | 953.070 ms | 948.482 ms - 957.962 ms |
tds_new_5d/tds_new/25 |
5D | 25 | well-conditioned | 997.657 ms | 982.027 ms - 1.025 s |
tds_new_5d/tds_new_adversarial/25 |
5D | 25 | adversarial | 871.978 ms | 868.052 ms - 877.029 ms |
Public API: DelaunayTriangulation::boundary_facets
| Benchmark ID | Dimension | Input | Variant | Mean | 95% CI |
|---|---|---|---|---|---|
boundary_facets/boundary_facets_2d/4000 |
2D | 4000 | well-conditioned | 1.694 ms | 1.690 ms - 1.698 ms |
boundary_facets/boundary_facets_2d_adversarial/4000 |
2D | 4000 | adversarial | 1.694 ms | 1.690 ms - 1.698 ms |
boundary_facets/boundary_facets_3d/750 |
3D | 750 | well-conditioned | 1.492 ms | 1.489 ms - 1.496 ms |
boundary_facets/boundary_facets_3d_adversarial/750 |
3D | 750 | adversarial | 1.511 ms | 1.505 ms - 1.518 ms |
boundary_facets/boundary_facets_4d/75 |
4D | 75 | well-conditioned | 498.7 µs | 493.5 µs - 504.7 µs |
boundary_facets/boundary_facets_4d_adversarial/75 |
4D | 75 | adversarial | 503.2 µs | 499.1 µs - 507.4 µs |
boundary_facets/boundary_facets_5d/25 |
5D | 25 | well-conditioned | 241.6 µs | 239.1 µs - 244.0 µs |
boundary_facets/boundary_facets_5d_adversarial/25 |
5D | 25 | adversarial | 234.2 µs | 230.7 µs - 238.1 µs |
Public API: ConvexHull::from_triangulation
| Benchmark ID | Dimension | Input | Variant | Mean | 95% CI |
|---|---|---|---|---|---|
convex_hull/from_triangulation_2d/4000 |
2D | 4000 | well-conditioned | 1.700 ms | 1.698 ms - 1.703 ms |
convex_hull/from_triangulation_2d_adversarial/4000 |
2D | 4000 | adversarial | 1.694 ms | 1.690 ms - 1.698 ms |
convex_hull/from_triangulation_3d/750 |
3D | 750 | well-conditioned | 1.489 ms | 1.485 ms - 1.494 ms |
convex_hull/from_triangulation_3d_adversarial/750 |
3D | 750 | adversarial | 1.512 ms | 1.508 ms - 1.517 ms |
convex_hull/from_triangulation_4d/75 |
4D | 75 | well-conditioned | 505.6 µs | 501.9 µs - 509.6 µs |
convex_hull/from_triangulation_4d_adversarial/75 |
4D | 75 | adversarial | 518.8 µs | 514.0 µs - 523.4 µs |
convex_hull/from_triangulation_5d/25 |
5D | 25 | well-conditioned | 242.6 µs | 239.1 µs - 246.7 µs |
convex_hull/from_triangulation_5d_adversarial/25 |
5D | 25 | adversarial | 233.8 µs | 231.8 µs - 236.0 µs |
Public API: DelaunayTriangulation::validate
| Benchmark ID | Dimension | Input | Variant | Mean | 95% CI |
|---|---|---|---|---|---|
validation/validate_3d/750 |
3D | 750 | well-conditioned | 34.983 ms | 34.853 ms - 35.141 ms |
validation/validate_3d_adversarial/750 |
3D | 750 | adversarial | 45.030 ms | 44.832 ms - 45.262 ms |
validation/validate_4d/75 |
4D | 75 | well-conditioned | 70.964 ms | 70.685 ms - 71.272 ms |
validation/validate_4d_adversarial/75 |
4D | 75 | adversarial | 68.111 ms | 67.652 ms - 68.595 ms |
validation/validate_5d/25 |
5D | 25 | well-conditioned | 62.154 ms | 62.044 ms - 62.266 ms |
validation/validate_5d_adversarial/25 |
5D | 25 | adversarial | 58.031 ms | 57.786 ms - 58.297 ms |
Public API: DelaunayTriangulation::insert
| Benchmark ID | Dimension | Input | Variant | Mean | 95% CI |
|---|---|---|---|---|---|
incremental_insert/insert_2d/10 |
2D | 10 | well-conditioned | 4.551 ms | 4.537 ms - 4.569 ms |
incremental_insert/insert_2d_adversarial/10 |
2D | 10 | adversarial | 7.049 ms | 6.915 ms - 7.241 ms |
incremental_insert/insert_3d/10 |
3D | 10 | well-conditioned | 6.189 ms | 6.151 ms - 6.233 ms |
incremental_insert/insert_3d_adversarial/10 |
3D | 10 | adversarial | 45.273 ms | 45.073 ms - 45.459 ms |
incremental_insert/insert_4d/6 |
4D | 6 | well-conditioned | 47.436 ms | 46.955 ms - 47.968 ms |
incremental_insert/insert_4d_adversarial/6 |
4D | 6 | adversarial | 145.440 ms | 144.901 ms - 146.033 ms |
incremental_insert/insert_5d/4 |
5D | 4 | well-conditioned | 619.248 ms | 615.715 ms - 622.850 ms |
incremental_insert/insert_5d_adversarial/4 |
5D | 4 | adversarial | 635.775 ms | 634.427 ms - 637.273 ms |
Public API: BistellarFlips
| Benchmark ID | Dimension | Input | Variant | Mean | 95% CI |
|---|---|---|---|---|---|
bistellar_flips_4d/k1_roundtrip |
4D | roundtrip | well-conditioned | 189.6 µs | 187.8 µs - 191.1 µs |
bistellar_flips_4d/k2_roundtrip |
4D | roundtrip | well-conditioned | 186.0 µs | 184.4 µs - 187.9 µs |
bistellar_flips_4d/k3_roundtrip |
4D | roundtrip | well-conditioned | 186.5 µs | 185.0 µs - 187.8 µs |
This focused predicate suite tracks la-stack-backed circumsphere and
insphere query performance independently from full triangulation workflows.
| Test Case | insphere | insphere_distance | insphere_lifted | Winner |
|---|---|---|---|---|
| Basic 2D | 18 ns | 23 ns | 8 ns | insphere_lifted |
| Boundary vertex | 1 ns | 24 ns | 209 ns | insphere |
| Far vertex | 17 ns | 24 ns | 8 ns | insphere_lifted |
| Test Case | insphere | insphere_distance | insphere_lifted | Winner |
|---|---|---|---|---|
| Basic 3D | 2.1 µs | 26 ns | 18 ns | insphere_lifted |
| Boundary vertex | 1 ns | 26 ns | 436 ns | insphere |
| Far vertex | 2.1 µs | 26 ns | 18 ns | insphere_lifted |
| Test Case | insphere | insphere_distance | insphere_lifted | Winner |
|---|---|---|---|---|
| Basic 4D | 5.3 µs | 56 ns | 2.9 µs | insphere_distance |
| Boundary vertex | 2 ns | 54 ns | 1.4 µs | insphere |
| Far vertex | 3.3 µs | 54 ns | 1.8 µs | insphere_distance |
| Test Case | insphere | insphere_distance | insphere_lifted | Winner |
|---|---|---|---|---|
| Basic 5D | 8.4 µs | 83 ns | 4.9 µs | insphere_distance |
| Boundary vertex | 2 ns | 81 ns | 2.3 µs | insphere |
| Far vertex | 5.2 µs | 81 ns | 2.9 µs | insphere_distance |
The tables above are the source of truth for predicate timing. insphere_lifted
shows advantages in lower dimensions such as 2D/3D, while insphere_distance
often wins in 4D/5D; boundary cases may favor insphere because of early exits.
The ci_performance_suite.rs benchmark is the primary regression and
release-summary suite. It emits a versioned api_benchmark_manifest and
covers public construction, hull, validation, insertion, boundary, and
bistellar-flip workflows across supported dimensions.
The circumsphere_containment.rs benchmark includes:
- Random queries: Batch processing performance with 1000 random test points
- Dimensional tests: Performance across 2D, 3D, 4D, and 5D simplices
- Edge cases: Boundary vertices and far-away points
- Numerical consistency: Agreement analysis between all methods
This file is automatically generated from benchmark results. For release-facing updates:
just bench-perf-summaryFor manual diagnostics without the release recipe, use the underlying CLI:
# Re-render from currently available Criterion data
uv run benchmark-utils generate-summary
# Run fresh perf-profile public API and circumsphere benchmarks
uv run benchmark-utils generate-summary --run-benchmarks --profile perf
# Generate baseline results for regression testing
uv run benchmark-utils generate-baselineFor manual updates or custom analysis, modify the PerformanceSummaryGenerator
class in scripts/benchmark_utils.py. This provides enhanced control over
dynamic vs static content organization and supports parsing numerical accuracy
data from live benchmark runs.