/// bench_curves.cpp — Bezier / BSpline evaluation benchmarks /// /// Metrics: /// BezierEval/N{iterations} — evaluate() throughput on a cubic Bezier /// BSplineEval/N{iterations} — evaluate() throughput on a cubic BSpline #include #include #include #include #include #include using namespace vde; namespace { /// A cubic Bezier with control points scattered in [-10, 10]³ curves::BezierCurve sample_bezier() { static std::vector cp = { {0.0, 0.0, 0.0}, {3.0, 5.0, -1.0}, {7.0, -2.0, 4.0}, {10.0, 3.0, 2.0}}; return curves::BezierCurve(cp); } /// A cubic uniform BSpline with 7 control points curves::BSplineCurve sample_bspline() { static std::vector cp = { {0.0, 0.0, 0.0}, {2.0, 4.0, -1.0}, {5.0, 1.0, 3.0}, {8.0, -1.0, 1.0}, {11.0, 3.0, -2.0}, {13.0, 2.0, 0.0}, {15.0, 0.0, 1.0}}; static std::vector knots = {0,0,0,0, 0.25, 0.5, 0.75, 1,1,1,1}; return curves::BSplineCurve(cp, knots, 3); } /// N equally spaced t values in [0, 1] std::vector sample_params(int n) { std::vector t; t.reserve(n); for (int i = 0; i < n; ++i) t.push_back(static_cast(i) / (n - 1)); return t; } } // namespace // ── Bezier ──────────────────────────────────────────────────────────── static void BezierEval(benchmark::State& state) { auto curve = sample_bezier(); auto params = sample_params(state.range(0)); double sum = 0; for (auto _ : state) { for (double t : params) { auto p = curve.evaluate(t); benchmark::DoNotOptimize(sum += p.x()); } } benchmark::DoNotOptimize(sum); state.SetItemsProcessed(state.iterations() * params.size()); } BENCHMARK(BezierEval)->Arg(10000)->Arg(100000); // ── BSpline ─────────────────────────────────────────────────────────── static void BSplineEval(benchmark::State& state) { auto curve = sample_bspline(); auto params = sample_params(state.range(0)); double sum = 0; for (auto _ : state) { for (double t : params) { auto p = curve.evaluate(t); benchmark::DoNotOptimize(sum += p.x()); } } benchmark::DoNotOptimize(sum); state.SetItemsProcessed(state.iterations() * params.size()); } BENCHMARK(BSplineEval)->Arg(10000)->Arg(100000);