8 #include <Eigen/Geometry> 
    9 #include <Eigen/StdVector> 
   11 #include <benchmark/benchmark.h> 
   13 using namespace Eigen;
 
   24   m = 
q.toRotationMatrix();
 
   28   Quaterniond 
q(Quaterniond(Vector4d::Random()).normalized());
 
   29   Matrix3d 
m(Matrix3d::Random());
 
   33     benchmark::DoNotOptimize(
m);
 
   43   lhs.noalias() = 
q * 
rhs;
 
   47   Quaterniond 
q(Quaterniond(Vector4d::Random()).normalized());
 
   48   Vector3d 
rhs(Vector3d::Random());
 
   49   Vector3d lhs(Vector3d::Random());
 
   53     benchmark::DoNotOptimize(lhs);
 
   67   Quaterniond 
q(Quaterniond(Vector4d::Random()).normalized());
 
   68   Quaterniond 
rhs(Quaterniond(Vector4d::Random()).normalized());
 
   69   Quaterniond lhs(Quaterniond(Vector4d::Random()).normalized());
 
   73     benchmark::DoNotOptimize(lhs);
 
   83   lhs.noalias() = 
q * 
rhs;
 
   87   Quaterniond 
q(Quaterniond(Vector4d::Random()).normalized());
 
   88   VectorXd 
rhs(VectorXd::Random(3));
 
   89   VectorXd lhs(VectorXd::Random(3));
 
   99 template<
int MSIZE, 
int OptionM1, 
int OptionM2, 
int OptionM3>
 
  101   const Matrix<double, MSIZE, MSIZE, OptionM1> & 
m,
 
  102   const Matrix<double, MSIZE, MSIZE, OptionM2> & 
rhs,
 
  103   Matrix<double, MSIZE, MSIZE, OptionM3> & lhs)
 
  105   lhs.noalias() = 
m * 
rhs;
 
  107 template<
int MSIZE, 
int OptionM1, 
int OptionM2, 
int OptionM3>
 
  110   Matrix<double, MSIZE, MSIZE, OptionM1> 
m(Matrix<double, MSIZE, MSIZE, OptionM1>::Random());
 
  111   Matrix<double, MSIZE, MSIZE, OptionM2> 
rhs(Matrix<double, MSIZE, MSIZE, OptionM2>::Random());
 
  112   Matrix<double, MSIZE, MSIZE, OptionM3> lhs(Matrix<double, MSIZE, MSIZE, OptionM3>::Random());
 
  146 template<
int MSIZE, 
int OptionM1, 
int OptionM2, 
int OptionM3>
 
  148   const Matrix<double, MSIZE, MSIZE, OptionM1> & 
m,
 
  149   const Matrix<double, MSIZE, MSIZE, OptionM2> & 
rhs,
 
  150   Matrix<double, MSIZE, MSIZE, OptionM3> & lhs)
 
  152   lhs.noalias() = 
m.transpose() * 
rhs;
 
  154 template<
int MSIZE, 
int OptionM1, 
int OptionM2, 
int OptionM3>
 
  157   Matrix<double, MSIZE, MSIZE, OptionM1> 
m(Matrix<double, MSIZE, MSIZE, OptionM1>::Random());
 
  158   Matrix<double, MSIZE, MSIZE, OptionM2> 
rhs(Matrix<double, MSIZE, MSIZE, OptionM2>::Random());
 
  159   Matrix<double, MSIZE, MSIZE, OptionM3> lhs(Matrix<double, MSIZE, MSIZE, OptionM3>::Random());
 
  187   const Matrix<double, MSIZE, MSIZE> & 
m,
 
  188   const Matrix<double, MSIZE, 1> & 
rhs,
 
  189   Matrix<double, MSIZE, 1> & lhs)
 
  191   lhs.noalias() = 
m * 
rhs;
 
  196   Matrix<double, MSIZE, MSIZE> 
m(Matrix<double, MSIZE, MSIZE>::Random());
 
  197   Matrix<double, MSIZE, 1> 
rhs(Matrix<double, MSIZE, 1>::Random());
 
  198   Matrix<double, MSIZE, 1> lhs(Matrix<double, MSIZE, 1>::Random());
 
  212   b->MinWarmUpTime(3.)->Arg(3)->Arg(4)->Arg(50);
 
  215 template<
int OptionM1, 
int OptionM2, 
int OptionM3>
 
  217   const Matrix<double, Dynamic, Dynamic, OptionM1> & 
m,
 
  218   const Matrix<double, Dynamic, Dynamic, OptionM2> & 
rhs,
 
  219   Matrix<double, Dynamic, Dynamic, OptionM3> & lhs)
 
  221   lhs.noalias() = 
m * 
rhs;
 
  223 template<
int OptionM1, 
int OptionM2, 
int OptionM3>
 
  226   const auto MSIZE = st.range(0);
 
  227   Matrix<double, Dynamic, Dynamic, OptionM1> 
m(
 
  228     Matrix<double, Dynamic, Dynamic, OptionM1>::Random(MSIZE, MSIZE));
 
  229   Matrix<double, Dynamic, Dynamic, OptionM2> 
rhs(
 
  230     Matrix<double, Dynamic, Dynamic, OptionM2>::Random(MSIZE, MSIZE));
 
  231   Matrix<double, Dynamic, Dynamic, OptionM3> lhs(
 
  232     Matrix<double, Dynamic, Dynamic, OptionM3>::Random(MSIZE, MSIZE));
 
  239 BENCHMARK(matrixDynamicMultMatrix<ColMajor, ColMajor, ColMajor>)
 
  241 BENCHMARK(matrixDynamicMultMatrix<RowMajor, ColMajor, ColMajor>)
 
  243 BENCHMARK(matrixDynamicMultMatrix<ColMajor, RowMajor, ColMajor>)
 
  245 BENCHMARK(matrixDynamicMultMatrix<RowMajor, RowMajor, ColMajor>)
 
  247 BENCHMARK(matrixDynamicMultMatrix<ColMajor, ColMajor, RowMajor>)
 
  249 BENCHMARK(matrixDynamicMultMatrix<RowMajor, ColMajor, RowMajor>)
 
  251 BENCHMARK(matrixDynamicMultMatrix<ColMajor, RowMajor, RowMajor>)
 
  253 BENCHMARK(matrixDynamicMultMatrix<RowMajor, RowMajor, RowMajor>)
 
  260   b->MinWarmUpTime(3.)->Arg(4)->Arg(50);
 
  263 template<
int OptionM1, 
int OptionM2, 
int OptionM3>
 
  265   const Matrix<double, Dynamic, Dynamic, OptionM1> & 
m,
 
  266   const Matrix<double, Dynamic, Dynamic, OptionM2> & 
rhs,
 
  267   Matrix<double, Dynamic, Dynamic, OptionM3> & lhs)
 
  269   lhs.noalias() = 
m.transpose() * 
rhs;
 
  271 template<
int OptionM1, 
int OptionM2, 
int OptionM3>
 
  274   const auto MSIZE = st.range(0);
 
  275   Matrix<double, Dynamic, Dynamic, OptionM1> 
m(
 
  276     Matrix<double, Dynamic, Dynamic, OptionM1>::Random(MSIZE, MSIZE));
 
  277   Matrix<double, Dynamic, Dynamic, OptionM2> 
rhs(
 
  278     Matrix<double, Dynamic, Dynamic, OptionM2>::Random(MSIZE, MSIZE));
 
  279   Matrix<double, Dynamic, Dynamic, OptionM3> lhs(
 
  280     Matrix<double, Dynamic, Dynamic, OptionM3>::Random(MSIZE, MSIZE));
 
  287 BENCHMARK(matrixDynamicTransposeMultMatrix<ColMajor, ColMajor, ColMajor>)
 
  289 BENCHMARK(matrixDynamicTransposeMultMatrix<RowMajor, ColMajor, ColMajor>)
 
  291 BENCHMARK(matrixDynamicTransposeMultMatrix<ColMajor, RowMajor, ColMajor>)
 
  293 BENCHMARK(matrixDynamicTransposeMultMatrix<RowMajor, RowMajor, ColMajor>)
 
  295 BENCHMARK(matrixDynamicTransposeMultMatrix<ColMajor, ColMajor, RowMajor>)
 
  297 BENCHMARK(matrixDynamicTransposeMultMatrix<RowMajor, ColMajor, RowMajor>)
 
  299 BENCHMARK(matrixDynamicTransposeMultMatrix<ColMajor, RowMajor, RowMajor>)
 
  301 BENCHMARK(matrixDynamicTransposeMultMatrix<RowMajor, RowMajor, RowMajor>)
 
  309   lhs.noalias() = 
m * 
rhs;
 
  313   const auto MSIZE = st.range(0);
 
  314   MatrixXd 
m(MatrixXd::Random(MSIZE, MSIZE));
 
  315   MatrixXd 
rhs(MatrixXd::Random(MSIZE, 1));
 
  316   MatrixXd lhs(MatrixXd::Random(MSIZE, 1));