#include #include using namespace Eigen; // Helper to get dimension from various transform types template struct TransformDim { static constexpr int value = T::Dim; }; template struct TransformDim> { static constexpr int value = Rows; }; template static void BM_TransformData(benchmark::State& state) { typedef typename Transformation::Scalar Scalar; constexpr int Dim = TransformDim::value; Transformation t; if constexpr (std::is_same_v>) { t.setRandom(); } else { Matrix mat; mat.setRandom(); t = Transformation(mat); } Matrix data; data.setRandom(); for (auto _ : state) { data = t * data; benchmark::DoNotOptimize(data.data()); } } // For quaternion: apply per-column template static void BM_QuatTransform(benchmark::State& state) { Quaternion q; q.setIdentity(); Matrix data; data.setRandom(); for (auto _ : state) { for (int i = 0; i < N; ++i) data.col(i) = q * data.col(i); benchmark::DoNotOptimize(data.data()); } } // Use typedefs to avoid commas in macro arguments typedef Transform Isometry3f_t; typedef Transform Affine3f_t; typedef Transform AffineCompact3f_t; typedef Matrix Matrix3f_t; BENCHMARK(BM_TransformData); BENCHMARK(BM_TransformData); BENCHMARK(BM_TransformData); BENCHMARK(BM_TransformData); BENCHMARK(BM_TransformData); BENCHMARK(BM_TransformData); BENCHMARK(BM_TransformData); BENCHMARK(BM_TransformData); BENCHMARK(BM_TransformData); BENCHMARK(BM_TransformData); BENCHMARK(BM_TransformData); BENCHMARK(BM_TransformData); BENCHMARK(BM_QuatTransform); BENCHMARK(BM_QuatTransform); BENCHMARK(BM_QuatTransform);